我有一個元類和和類,都使用__getattribute__
攔截屬性調用。他們是這樣的:__getattribute__在實例和類
class B(type):
def __getattribute__ (self, name) :
print(f'hello {self}')
return super().__getattribute__(name)
class C(metaclass=B):
MY_ATTR = 'hello attr'
def __getattribute__ (self, name) :
print(f'hello {self}')
return super().__getattribute__(name)
這表現爲,我打算:
C.MY_ATTR
# hello <class 'C'>
# 'hello attr'
C().MY_ATTR
# hello <C object at 0x10bcbbda0>
# 'hello attr'
現在我要帶從B
和C
重複的代碼,並讓它繼承。幸運我給他們打了電話B
和C
並留下了空間A
。在這裏,我們去:
class A:
def __getattribute__ (self, name) :
print(f'hello {self}')
return super().__getattribute__(name)
class B(type, A):
pass
class C(A, metaclass=B):
MY_ATTR = 'hello attr'
不幸的是,這種行爲不再像以前那樣:
C.MY_ATTR
# 'hello attr'
C().MY_ATTR
# hello <C object at 0x10bcbbda0>
# 'hello attr'
我認爲問題是圍繞一個元不能夠從一個普通類繼承的東西,但我不能確定。我也開放給任何其他實現(可能不需要元類)獲取相同的行爲 - 但我仍然想要調用像C.MISSING
來提高AttributeError
。
也有類似的問題(例如Get attributes for class and instance in python),但它們略有不同,並沒有達到我想要的。
感謝
OOC,如果您先從「A」繼承,會發生什麼情況'B類(A,類型):'? – ShadowRanger
是的,我曾試過這個。 C.MY_ATTR引發異常。 '你好 __getattribute__ TypeError:期待1個參數,得到0' –
freebie