2024-09-28 03:24:58 发布
网友
在我的项目中,我必须经常重复这部分代码:
class SimplePhysicObject(Object): def __init__(self): super(Object, self).__init__('SimplePhysicObject')
但是每次都有新的字符串代替SimplePhysicObject。有没有什么方法可以编写一些宏来简化这项工作?比如:
SimplePhysicObject
UPD对不起,Object是我之前在代码中声明的类
Object
我看不出Object需要实际类名作为参数的原因。您可以通过self.__class__.__name__访问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派生,name属性将设置为派生类的名称,而原始代码将继续使用"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,您可以查看^{}的实现,该实现还动态地创建类,以了解如何使用新的^{}函数。在
super()
重要的一点是,这不是一个真正的宏,它不会在“编译器”处理它之前扩展到类定义中。它将返回一个新的type对象,这取决于您确保它进入正确的名称空间。在
type
获取super(…).__init__的参数并不困难。它将类对象作为super自身的参数,最好手动处理:
super(…).__init__
super
class SimplePhysicObject(Object): def __init__(self): cls = SimplePhysicObject super(cls, self).__init__(cls.__name__)
我看不出
Object
需要实际类名作为参数的原因。您可以通过self.__class__.__name__
访问Object
中的实际类名:将打印
^{pr2}$这与原始代码略有不同:如果从
SimplePhysicObject
派生,name
属性将设置为派生类的名称,而原始代码将继续使用"SimplePhysicObject"
。在要做一些接近你想要的事情而不是另一种方法,你可以使用如下方法:
这对python2.7有效。(当您使用旧的} 的实现,该实现还动态地创建类,以了解如何使用新的^{} 函数。在
super()
语法时)如果您使用的是python3.2,您可以查看^{重要的一点是,这不是一个真正的宏,它不会在“编译器”处理它之前扩展到类定义中。它将返回一个新的
type
对象,这取决于您确保它进入正确的名称空间。在获取
super(…).__init__
的参数并不困难。它将类对象作为super
自身的参数,最好手动处理:相关问题 更多 >
编程相关推荐