Python3 的描述符--完整例子詳細解釋


##描述符類的例子,這個例子說明了描述符和被描述符之間的關系

##攝氏溫度

class Celsius():      ## 1 描述符類                                         
    def __init__(self,value = 26.0):   ## 2攝氏溫度值初始化賦值
        self.value = float(value)      ## 3
    def __get__(self,instance,owner):  ## 4
        return self.value              ## 5
    def __set__(self,instance,value):  ##6
        self.value = float(value)      ##7

##華氏溫度

class Fahrenheit():                    ## 8 描述符類
    def __get__(self,instance,owner):  ##  8.1
        return instance.cel * 1.8 +32  ## 9
    def __set__(self,instance,value):  ## 10
        instance.cel = (float(value)-32)/18  ##11

##被描述的類

class Temperature():     ## 12 被描述符類
    cel = Celsius()      ## 13 描述符類指派到被描述符類的對象
    fah = Fahrenheit()   ## 14 描述符類指派到被描述符類的對象

###輸入輸出結果演示

>>> temp = Temperature() #15
>>> temp.cel             #16
26.0                     #17
>>> temp.cel = 30        #18
>>> temp.fah             #19
86.0                     #20
>>> temp.fah =  100      #21
>>> temp.cel             #22
3.7777777777777777       #23
>>>                     

###解釋這一段代碼, 
'''首先解釋這個程序代碼:上邊的攝氏溫度和華氏溫度都是描述符,都是對下邊的那個被描述符類進行
描述的,描述的是他的屬性cel fah 這兩個屬性參數。這里邊的屬性關系13 14 兩個語句是對被描述符
的兩個屬性的相當於賦值相當於實例化的一個操作,那么cel 和fah 這兩個被描述符的屬性就相當於是
描述符Celsius()和Fahrenheit()的實例化對象了。
現在根據輸入輸出來解釋實際操作時的一些問題,當輸入15的時候,就是被描述符的一個實例化。16就
是對實例化對象也就是被描述對象的屬性訪問,這時注意到13這個屬性又被Celsius()所描述,那么就會
回到1處,Celsius()描述符類中有2,那么就會初始化一個值,傳過去就是屬性的值cel.value = 26.0,
那么接下來16就是被描述對象訪問屬性,這個屬性值是26.0.
那么18就很明顯就是對被描述對象的賦值了,娜美被描述對象的cel屬性就是30,此時13句就起到了作用
就是說屬性cel被賦值,那么對這個屬性的就進行操作了,賦值操作就是Celsius()描述符類的__set__
操作,那就是語句6,得到cel.value = 30 ,接下來輸入輸出結果中19句的由來就是,由於6句的處理得到
cel.value = 30,然后到8,也就是對被描述符對象的屬性fah進行訪問,那么就是到Fahrenheit()中的
8.1進行獲取的操作,獲取操作9,instance是實例化對象擁有者temp,那么9的公式就是返回temp.cel * 1.8 +32
而temp.cel 在18的時候經過操作已經賦值為30,所以這里的返回值就是計算的結果86.0,。同理接下來的輸入輸出
結果的內容結束的方式和上邊的解釋思想是一樣的。

 

 

注:初學者難免會有理解不對和理解不到位的地方,還望大家批評指正,謝謝!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM