我想換我圍繞如何頭部__getattribute__和__getattr__作業在Python相對于非實體類和子類。具體來說,我想捕獲getattribute超類中的呼叫并可能相應地對其進行修改。
在以下代碼片段中,當呼叫任何方法時,我預計至少會有一些中間列印陳述句,但我什么也沒得到。找到并回傳了類變數,但似乎沒有呼叫任何魔術方法。這是為什么?
class SuperbClass:
def __getattribute__(self, attr):
print(f"called in superb, found {attr}")
# get the attribute via `object`
return f"{super(SuperbClass, self).__getattribute__(attr)}MODIFIED_IN_SUPER"
def __getattr__(self, attr):
self.__getattribute__(attr)
class SubberClass(SuperbClass):
MyClassVar = "I am a cool message"
def __getattribute__(self, attr):
print("called in subber")
super(SuperbClass, self).__getattribute__(attr)
def __getattr__(self, attr):
self.__getattribute__(attr)
if __name__ == '__main__':
print(SubberClass.MyClassVar)
# Only prints `I am a cool message`
inst = SubberClass()
print(inst.MyClassVar)
# prints called in subber
# and prints None
編輯:更新代碼以反映類和實體之間的差異
uj5u.com熱心網友回復:
類的__getattribute__和__getattr__處理類實體的屬性決議。如果要為類本身處理屬性決議,則需要在類的類上定義__getattribute__或:它的元類。__getattr__
class Meta(type):
def __getattribute__(self, attr):
print('*This* prints.')
return super().__getattribute__(attr)
class Blah(metaclass=Meta):
MyClassVar = 'blah'
if __name__ == '__main__':
Blah.MyClassVar
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/345006.html
