python中的自引用类定义

2024-06-24 12:14:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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


Tags: name声明示例datetimesystemstartclassint
3条回答

I understand what is happening, the name of the class isn't in scope inside the class.

不完全是。在定义类的内容(例如作用域)时,尚未定义类的名称。

试试这个:

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)

i've got a metaclass that reads this information and does some setup

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

subplan = ForeignKey('self')

Google App Engine

subplan = SelfReferenceProperty()

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

相关问题 更多 >