可能重复:
Can I get a reference to the 'owner' class during the init method of a descriptor?Python:类静态成员指向自己?
代码是胜过千言万语:
>>> class ShortRib(object):
>>> def __init__(self, owner):
>>> self.owner = owner
>>>
>>> ... some more methods and stuff ...
>>>
>>>
>>> class Cow(object):
>>> shortRib = ShortRib(self)
>>>
>>>
>>> class BrownCow(Cow):
>>> pass
>>>
>>> BrownCow.shortRib.owner
<class '__main__.BrownCow'>
这是不行的,但我希望它会。基本上,我希望每个类都有一些静态/类变量(我不确定它在哪种情况下),但需要每个人都知道它属于哪个类。不幸的是,我不能在班级声明的主体中“获得”班级。当然,我总是可以用一个装饰者来做这件事:
>>> def vars(**kwargs):
>>> def wrap(cls):
>>> for k, w in kwargs.items():
>>> setattr(cls, k, w(cls))
>>> return cls
>>> return wrap
>>>
>>> @vars(shortRib=lambda cls: ShortRib(cls)
>>> class BrownCow(Cow):
>>> ...
>>>
>>> BrownCow.shortRib.owner
哪会工作。另一种方法是使类装饰器遍历所有的shortRib和类似的静态变量,并在类声明完成后设置它们的所有者。然而,这看起来像是一个令人难以置信的迂回和不直观的做法,应该是一个非常简单的操作:让一个班的静态/班级成员知道他们属于谁。
有没有一个“适当”的方式来做到这一点?
澄清:
我想这些成员属于类,而不是实例。我试图去找一个几乎是纯粹功能的风格,只使用类来继承共享行为,而不是创建它们的实例。实例会倾向于让我的函数访问所有函数共享的任意实例数据,这会破坏我尝试的纯函数。我可以使用我不触及的空实例,但我认为使用纯类会更清晰。
“所有者”应该是所有者的类还是所有者对象? – tauran
@Cat - 不重复。也许他需要在创建实例之前绑定'ShortRib' - '__init__'可能不够早。 – agf
@agf:再次阅读。 –