詳解Python魔法方法之描述符類
描述符類要求:
描述符就是將某種特殊類型的類的實例指派給另一個類的屬性
至少要實現以下的一個方法:
•__get__(self, instance, owner) –用於訪問屬性,它返回屬性的值 •__set__(self, instance, value) –將在屬性分配操作中調用,不返回任何內容 •__delete__(self, instance) –控制刪除操作,不返回任何內容
eg:
>>> class MyDecriptor: def __get__(self,instance,owner): print("getting...",self,instance,owner) def __set__(self,instance,value): print("setting...",self,instance,value) def __delete__(self,instance): print("deleting...",self,instance) >>> class Test: x = MyDecriptor() #取Mydecriptor類的實例指派給Test類的屬性x
測試:
eg:
>>> class MyProperty: def __init__(self,fget = None,fset = None,fdel = None): self.fget = fget self.fset = fset self.fdel = fdel def __get__(self,instance,owner): return self.fget(instance) def __set__(self,instance,value): self.fset(instance,value) def __delete__(self,instance): self.fdel(instance) >>> class C: def __init__(self): self._x = None def getX(self): return self._x def setX(self,value): self._x = value def delX(self): del self._x x = MyProperty(getX,setX,delX) >>> c = C() >>> c.x = "HELLOW" >>> c.x 'HELLOW' >>> c._x 'HELLOW' >>> del c.x >>> c._x
eg:
攝氏度轉華氏度:華氏度=攝氏度*1.8+32
要求:
•先定義一個溫度類,然後定義兩個描述符類用於描述攝氏度和華氏度兩個屬性。
•要求兩個屬性會自動進行轉換,也就是說你可以給攝氏度這個屬性賦值,然後打印的華氏度屬性是自動轉換後的結果。
ss Celsius: #攝氏度描述符類 def __init__(self,value = 26.0):#self為描述符類自身(此為攝氏度描述符類)的實例(此為cel) self.value = float(value) def __get__(self,instance,owner):#instance是這個描述符的擁有者所在的類的實例(此為temp) return self.value def __set__(self,instance,value):#owner是這個描述符的擁有者所在的類本身(此為溫度類) self.value = float(value) class Fahrenheit: #華氏度描述符類 def __get__(self,instance,owner): return instance.cel * 1.8 +32 #攝氏度轉華氏度 def __set__(self,instance,value): instance.cel = ((float)(value)- 32)/ 1.8 ## instance.cel 則會執行Temperature.cel,接著執行Celsius類中的__set__方法 class Temperature: #溫度類 cel = Celsius() #設置攝氏度屬性(描述符類的實例指派給瞭溫度類的屬性) fah = Fahrenheit()# temp.fah ,當屬性fah被賦值的時候,則會執行Fahrenheit描述符類的__set__方法 >>> temp = Temperature() >>> temp.cel 26.0 >>> temp.fah 78.80000000000001 >>> temp.fah = 78.8 >>> temp.cel 25.999999999999996
到此這篇關於詳解Python魔法方法之描述符類的文章就介紹到這瞭,更多相關python描述符類內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!