Python3 魔法方法:屬性訪問
阿新 • • 發佈:2018-02-09
獲取 attr super() 父類 有關 self val color def
1、與屬性訪問有關的魔法方法
__getattr__(self,name)
定義當用戶試圖獲取某一不存在的屬性時的行為
__getattribute__(self,name)
定義當該類屬性被訪問時的行為
__setattr__(self,name,value)
定義一個屬性被設置時的行為
__delattr__(self,name)
定義一個屬性被刪除時的行為
註意:
def __setattr__(self, name, value): self.name = value + 1 #此代碼試圖在對對象的屬性進行賦值時讓屬性的值加1但是 self.name = value + 1這句又會觸發 __setattr__從而導致無限遞歸
正確寫法:
def __setattr__(self, name, value): super().__setattr__(name,value+1) #尋找父類的__setattr__方法來對屬性name賦值
或者:
def __setattr__(self, name, value): self.__dict__[name] = value + 1
以下的代碼問題:
class Counter: def __init__(self): self.counter = 0 #這裏會觸發 __setattr__ 調用 def __setattr__(self, name, value): self.counter += 1 “””既然需要 __setattr__ 調用後才能真正設置 self.counter 的值,所以這時候 self.counter 還沒有定義,所以沒法 += 1,錯誤的根源。””” super().__setattr__(name, value) def __delattr__(self, name): self.counter -= 1 super().__delattr__(name)
定義一個count類實現檢測屬性的增減
class Counter: def __init__(self): self.counter = 0 def __setattr__(self, name, value): if name== ‘counter‘: super().__setattr__(name, value) else: self.counter += 1 super().__setattr__(name, value) def __delattr__(self, name): if name ==‘counter‘: super().__delattr__(name) else: self.counter -= 1 super().__delattr__(name)
class Counter: def __init__(self): super().__setattr__(‘counter‘, 0) def __setattr__(self, name, value): super().__setattr__(‘counter‘, self.counter + 1) super().__setattr__(name, value) def __delattr__(self, name): super().__setattr__(‘counter‘, self.counter - 1) super().__delattr__(name)
Python3 魔法方法:屬性訪問