執行個體屬性和類屬性
理論基礎
類屬性有點類似C++中的靜態變數,可以通過 【類名.屬性 】直接存取
執行個體屬性故名思議就是只有定義了類的執行個體後才可以用的屬性
通過類名不可以訪問執行個體屬性
通過執行個體可以訪問類屬性
如果執行個體屬性給類屬性進行了賦值操作,則會將其覆蓋。
程式碼範例
class SYG(object): class_var = 1 def __init__(self): self.instance_var = 2if __name__ == '__main__': syg = SYG() #可以通過執行個體來反訪問類屬性 print(syg.class_var) print(SYG.class_var) #不可以用類名訪問執行個體變數 #print(SYG.instance_var) #執行個體屬性會覆蓋類屬性 syg.class_var = 3 print(syg.class_var) print(SYG.class_var)
執行個體屬性操作重載object方法
如果我們要控制自己類中的執行個體屬性,可以通過重載以下幾個方法來實現特殊功能
★這些方法不能對類屬性進行操作
__getattr__ 訪問在類中未被定義的屬性時會被調用
__setattr__ 設定所有的屬性時被調用
__delattr__ 刪除所有的屬性時被調用
__getattribute__ 訪問所有的屬性時會被調用,這個被重載後。包含__getattr__
程式碼範例:
class SYG(object): def __init__(self): self.xx = 0 def __getattr__(self,name): print("override getattr") return object.__getattr__(self,name) def __setattr__(self,name,value): print("override setattr") return object.__setattr__(self,name,value) def __delattr__(self,name): print('override delattr') return object.delattr(self,name) def __getattribute__(self,name): print('override getattribute') return object.__getattribute__(self,name)if __name__ == '__main__': syg = SYG() syg.test = 3 print(syg.test) print(syg.ok) #由於存在這個屬性會拋出異常
輸出結果:
override setattr
override getattribute
3
override getattribute
override getattr
Traceback (most recent call last):
File "temp.py", line 27, in <module>
print(syg.ok)
File "temp.py", line 9, in __getattr__
return object.__getattr__(self,name)
AttributeError: type object 'object' has no attribute '__getattr__'
使用property
一般函數實現
class SYG(object): def __init__(self): self._x = 0 def getx(self): print("getx") return self._x def setx(self,value): print('setx') self._x = value def delx(self): del self._x #定義自己的set,get,del操作 newx = property(getx, setx, delx) if __name__ == '__main__': syg = SYG() syg.newx = 3 print(syg.newx)
用decorator方法實現
class SYG(object): def __init__(self): self._x = 0 @property def var_x(self): print('readonly _x') return self._x @var_x.setter def var_x(self,value): print('setx') self._x = value @var_x.deleter def var_x(self): del self._xif __name__ == '__main__': syg = SYG() syg.var_x = 3 print(syg.var_x)
《本節完》