python __getattr__ 和 __setattr__方法
阿新 • • 發佈:2018-12-12
1、__getattr__
攔截點號運算。當對未定義的屬性名稱和例項進行點號運算時,就會用屬性名作為字串呼叫這個方法。如果繼承樹可以找到該屬性,則不呼叫此方法
例:當調x.age的時候,不會走到__getattr__ 方法。調x.name的時候(此時demo的__init__方法沒有定義name屬性),此時會調__getattr__方法。
class demo: def __init__(self): self.name = 'dd' def __getattr__(self, attrname): if attrname =="age": return 40 else: raise(attrname) x = demo() print(x.age) print(x.name)
2、__setattr__
例:會攔截所有屬性的的賦值語句。當在__setattr__方法內對屬性進行賦值是,不可使用self.attr = value,因為他會再次呼叫self,__setattr__("attr", value),則會形成無窮遞迴迴圈,最後導致堆疊溢位異常。應該通過對屬性字典做索引運算來賦值任何例項屬性,也就是使用self.__dict__['name'] = value.
class demo: def __setattr__(self, attrname, value): if attrname == "ddd": self.__dict__[attrname] = value else: print("ggg") x = demo() x.ddd = "xxx" print(x.ddd) output:xxx