可能重複:
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:再次閱讀。 –