Python中的自引用类定义
有没有办法在类的声明内部引用类名?下面是一个例子:
class Plan(SiloBase):
cost = DataField(int)
start = DataField(System.DateTime)
name = DataField(str)
items = DataCollection(int)
subPlan = ReferenceField(Plan)
我有一个元类,它会读取一些信息并进行一些设置,而基类则实现了一些通用的保存功能。我希望能够像这样创建递归定义,但到目前为止,在我的实验中,我一直无法达到想要的效果,通常会遇到“Plan未定义”的错误。我明白发生了什么,类的名字在类内部是不可用的。
5 个回答
2
我明白发生了什么,类的名字在类内部是不可用的。
其实不是这样。类的名字在定义它的内容(比如作用域)的时候还没有被定义。
25
试试这个:
class Plan(SiloBase):
cost = DataField(int)
start = DataField(System.DateTime)
name = DataField(str)
items = DataCollection(int)
Plan.subPlan = ReferenceField(Plan)
或者像这样使用 __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)
9
我有一个元类,它会读取一些信息并进行一些设置。
大多数使用元类的框架都提供了解决这个问题的方法。例如,Django:
subplan = ForeignKey('self')
subplan = SelfReferenceProperty()
像在后面加一个额外的属性或者使用 __new__
这样的解决方案有个问题,那就是大多数ORM(对象关系映射)元类在创建类的时候就希望类的属性已经存在了。