Python中的自引用类定义

22 投票
5 回答
8062 浏览
提问于 2025-04-15 12:22

有没有办法在类的声明内部引用类名?下面是一个例子:

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')

Google App Engine

subplan = SelfReferenceProperty()

像在后面加一个额外的属性或者使用 __new__ 这样的解决方案有个问题,那就是大多数ORM(对象关系映射)元类在创建类的时候就希望类的属性已经存在了。

撰写回答