[英]Macros in python
在我的项目中,我必须经常重复这部分代码:
class SimplePhysicObject(Object):
def __init__(self):
super(Object, self).__init__('SimplePhysicObject')
但是, SimplePhysicObject
都有新的字符串,而不是SimplePhysicObject
。 有没有办法编写一些宏来使这项工作更容易? 就像是:
DoTemplate(NewObject)
==>
class NewObject(Object):
def __init__(self):
super(Object, self).__init__('NewObject')
UPD抱歉, Object
是我之前在代码中声明的类
我没有看到为什么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
将打印
SimplePhysicObject
这与原始代码略有不同:如果从SimplePhysicObject
派生,则name
属性将设置为派生类的名称,而原始代码将继续使用"SimplePhysicObject"
。
获得super(…).__init__
的参数并不难。 它将类对象作为super
本身的参数,最好手动处理:
class SimplePhysicObject(Object):
def __init__(self):
cls = SimplePhysicObject
super(cls, self).__init__(cls.__name__)
要做一些接近你想要的东西而不是另一种方法,你可以使用这样的东西:
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
对象,由您来确保它进入正确的命名空间。
你可以这样做,让DoTemplate
函数返回一个新的实例化类,你可以从Objects __class__
字符串中获取类名。
我认为您正在寻找MacroPy: https : //github.com/lihaoyi/macropy#case-classes
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.