描述符:將某種特殊類型的類的實例指派給另一個類的屬性
a類中的屬性a.fa,是通過b類來訪問、設置、刪除的,那麼b類就叫屬性a.fa的描述符
(用b類描述fa到底是什麼樣子的)
有時候,某個應用程序可能會有一個相當微妙的需求,需要你設計一些更爲複雜的操作來響應(例如每當屬性被訪問時,你也許想創建一個日誌記錄)。最好的解決方案就是編寫一個用於執行這些“更復雜的操作”的特殊函數,然後指定它在屬性被訪問時運行。那麼一個具有這種函數的對象被稱之爲描述符.
簡言之:描述符就是一個類,一個至少實現 get()、set() 或 delete() 三個特殊方法中的任意一個的類
作用:可以讓程序更加優雅,這裏有一些說明
__get__(self,instance,owner) # 用於屬性訪問,返回屬性的值
__set__(self,instance,value) # 將屬性分配操作中調用,無返回值
__delete__(self,instance,value) # 控制刪除操作不返回
舉個栗子:
1.定義一個溫度類
2.定義兩個描述類(描述攝氏度和華氏度兩個屬性)
3.要求攝氏度與華氏度可以相互轉換(即:通過給攝氏度屬性賦值,可打印出華氏度屬性)
說明:例子中類Temperature的屬性cel、屬性fah,一兩句話描述不清楚,所以藉助專門的類來描述
他們,這個類就叫描述符
class Celsius: # 描述類:攝氏度
def __init__(self, value=26.0): #初始化
self.value = float(value)
def __get__(self, instance, owner): # 當類Celsius被獲得時調用(cel = Celsius())
return self.value # instance:實例(這裏是t);ower:擁有者(這裏是Temperature)
def __set__(self, instance, value): # 當類Celsius被設置時調用(cel = Celsius(30))
self.value = float(value) # instance:實例(這裏是t);value:具體值
class Fahrenheit: # 描述類:華氏度
def __get__(self, instance, owner): # 當類Celsius被獲得時調用(fah = Fahrenheit())
return instance.cel * 1.8 + 32 # instance:實例(這裏是t);ower:擁有者(這裏是Temperature)
def __set__(self, instance, value): # 當類Celsius被設置時調用(fah = Fahrenheit(100))
instance.cel = (float(value) - 32) / 1.8 # instance:實例(這裏是t);value:具體值
class Temperature: # 溫度類:擁有Celsius和Fahrenheit兩個描述符
cel = Celsius()
fah = Fahrenheit()
運行:
t = Temperature()
print(t.cel)
結果:
26.0
運行:
t = Temperature()
t.cel = 30
print(t.fah)
結果:
86.0
運行:
t = Temperature()
t.fah = 100 # fah賦值:自動執行Fahrenheit:__set__;instance.cel = (float(value) - 32) / 1.8
# 這裏的instance.cel等價於t.cel,是對cel賦值:自動執行Celsius:__set__:self.value = float(value)
# 對t.cel賦予了新的值37.7777
print(t.cel) # 訪問t.cel:自動執行Celsius:__get__return self.value
結果:
37.77777777777778