__getattr__、__setattr__、__delattr__、__getattrbute__方法個人理解
阿新 • • 發佈:2018-06-24
通過 本質 attr_ foo IT recursion IV dep 實現
################ 所有方法參考 __setattr__() ######################
類中:
__getattr__ () # 在調用不存在的屬性時默認會調用
__setattr__() # 設置新的屬性時會調用,就是通過此方法,將你設置的屬性添加到了__dict__中。
如果類中定義了該方法,則設置屬性時執行該方法,但是設置的屬性沒有添加到__dict__中
如果類中又定義了該方法,方法中也設置了屬性,就會進入無限遞歸,
所以可以通過__dict__()來操作
例如:
# 一 class Foo(object): def __init__(self, name, id): self.name = name self.id = id def eat(self): print("%s " % self.name) def __setattr__(self, k, v): print(‘hehheeeeeeeeeeeeeeeeee‘) f1 = Foo(‘he‘, 12) # 設置屬性,因為類中有了__setattr__,所以設置屬性時會執行, print(f1.__dict__) # 設置的屬性並沒有添加到__dict__中, 方法中並沒有實現設置屬性的功能 >>> hehheeeeeeeeeeeeeeeeee hehheeeeeeeeeeeeeeeeee {} # 二 class Foo(object): def __init__(self, name, id): self.name = name self.id = id def eat(self): print("%s " % self.name) def __setattr__(self, k, v): print(‘hehheeeeeeeeeeeeeeeeee‘) self.k = v # 再次處罰 __setattr__() 進入死遞歸 f1 = Foo(‘he‘, 12) print(f1.__dict__) >>> RecursionError: maximum recursion depth exceeded # 死遞歸錯誤 # 三 class Foo(object): def __init__(self, name, id): self.name = name self.id = id def eat(self): print("%s " % self.name) def __setattr__(self, k, v): print(‘hehheeeeeeeeeeeeeeeeee‘) self.__dict__[k] = v # 只能通過此方式設置,底層也是這麽做的,設置屬性的本質 f1 = Foo(‘he‘, 12) print(f1.__dict__) >>> hehheeeeeeeeeeeeeeeeee hehheeeeeeeeeeeeeeeeee {‘name‘: ‘he‘, ‘id‘: 12}
# 其他方法類似
__delattr__ () # 刪除屬性時,會調用
__getattrbute__() #
__getattr__、__setattr__、__delattr__、__getattrbute__方法個人理解