2

在我的项目中,我必须经常重复这部分代码:

class SimplePhysicObject(Object):
    def __init__(self):
        super(Object, self).__init__('SimplePhysicObject')

但不是SimplePhysicObject每次都有新字符串。有没有办法编写一些宏来使这项工作更容易?就像是:

DoTemplate(NewObject)
==>
class NewObject(Object):
    def __init__(self):
        super(Object, self).__init__('NewObject')

UPD对不起,Object我自己的类之前在代码中声明过

4

5 回答 5

7

我看不出为什么Object需要实际的类名作为参数。Object您可以通过以下方式访问实际的类名self.__class__.__name__

class Object(object):
    def __init__(self):
        self.name = self.__class__.__name__

class SimplePhysicObject(Object):
    pass

a = SimplePhysicObject()
print a.name

将打印

SimplePhysicObject

这与您的原始代码略有不同:如果您从 派生SimplePhysicObject,则该name属性将设置为派生类的名称,而您的原始代码将继续使用"SimplePhysicObject".

于 2012-07-26T18:30:22.360 回答
3

得到论证super(…).__init__并不难。它将类对象作为super自己的参数,最好手动处理:

class SimplePhysicObject(Object):
    def __init__(self):
        cls = SimplePhysicObject
        super(cls, self).__init__(cls.__name__)
于 2012-07-26T18:22:54.013 回答
1

为了做一些接近你想要的事情而不是替代方法,你可以使用这样的东西:

CLASS_TEMPLATE = """
class {name}(object):
    def __init__(self):
        super({name}, self).__init__('{name}')
"""

def main():
    name = "SimplePhysicsObject"
    exec CLASS_TEMPLATE.format(name=name)
    print locals()[name]

if __name__ == '__main__':
    main()

这对 Python 2.7 有效。(看到您使用的是旧super()语法。)如果您使用的是 Python 3.2,您可以查看它的实现collections.namedtuple,它还动态创建类以了解如何使用新exec()函数。

重要的一点是,这不是一个真正的宏,它不会在“编译器”处理它之前扩展为类定义。它将返回一个新type对象,由您来确保它进入正确的命名空间。

于 2012-07-26T18:35:28.197 回答
0

您完全可以这样做,让DoTemplate函数返回一个新的实例化类,然后您可以从 Objects__class__字符串中获取类名。

于 2012-07-26T18:22:41.077 回答
0

我认为 MacroPy 是您正在寻找的: https ://github.com/lihaoyi/macropy#case-classes

于 2013-05-13T20:10:47.760 回答