python中的自引用类定义

ped*_*lar 19 python

有没有办法从类声明中引用类名?一个例子如下:

class Plan(SiloBase):
    cost = DataField(int)
    start = DataField(System.DateTime)
    name = DataField(str)
    items = DataCollection(int)
    subPlan = ReferenceField(Plan)
Run Code Online (Sandbox Code Playgroud)

我有一个读取此信息的元类并进行一些设置,基类实现了一些常见的保存.我希望能够创建这样的递归定义,但到目前为止,在我的实验中,我无法获得我想要的效果,通常会遇到"计划未定义"错误.我理解发生了什么,类的名称不在类的范围内.

Eva*_*ark 24

试试这个:

class Plan(SiloBase):
    cost = DataField(int)
    start = DataField(System.DateTime)
    name = DataField(str)
    items = DataCollection(int)

Plan.subPlan = ReferenceField(Plan)
Run Code Online (Sandbox Code Playgroud)

或使用__new__这样:

class Plan(SiloBase):

    def __new__(cls, *args, **kwargs):
        cls.cost = DataField(int)
        cls.start = DataField(System.DateTime)
        cls.name = DataField(str)
        cls.items = DataCollection(int)
        cls.subPlan = ReferenceField(cls)
        return object.__new__(cls, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)


Mil*_*les 8

我有一个读取此信息并进行一些设置的元类

大多数使用元类的框架都提供了解决此问题的方法.例如,Django:

subplan = ForeignKey('self')
Run Code Online (Sandbox Code Playgroud)

Google App Engine:

subplan = SelfReferenceProperty()
Run Code Online (Sandbox Code Playgroud)

解决方案的问题,例如在以后使用或使用附加属性,__new__是大多数ORM元类都希望在创建类时存在类属性.