python中的宏

2024-09-28 03:24:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

但是每次都有新的字符串代替SimplePhysicObject。有没有什么方法可以编写一些宏来简化这项工作?比如:

^{pr2}$

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


Tags: 项目方法字符串代码self声明objectinit
3条回答

我看不出Object需要实际类名作为参数的原因。您可以通过self.__class__.__name__访问Object中的实际类名:

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

class SimplePhysicObject(Object):
    pass

a = SimplePhysicObject()
print a.name

将打印

^{pr2}$

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

要做一些接近你想要的事情而不是另一种方法,你可以使用如下方法:

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()

这对python2.7有效。(当您使用旧的super()语法时)如果您使用的是python3.2,您可以查看^{}的实现,该实现还动态地创建类,以了解如何使用新的^{}函数。在

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

获取super(…).__init__的参数并不困难。它将类对象作为super自身的参数,最好手动处理:

class SimplePhysicObject(Object):
    def __init__(self):
        cls = SimplePhysicObject
        super(cls, self).__init__(cls.__name__)

相关问题 更多 >

    热门问题