python-類-魔法方法-描述符

描述符:將某種特殊類型的類的實例指派給另一個類的屬性

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章