繁体   English   中英

python中的宏

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM