第7.27節 Python案例詳解: @property裝飾器定義屬性訪問方法getter、setter、deleter

上節詳細介紹了利用@property裝飾器定義屬性的語法,本節經過具體案例來進一步說明。
1、    案例說明
本節的案例是定義Rectangle(長方形)類,爲了說明問題,除構造函數外,其餘方法都只定義了長度屬性的操做。包括三個完整的裝飾器,若是你們想試一下少一個操做方法的裝飾器,能夠直接把對應裝飾器去除便可。ide

2、    案例代碼
1.    定義類Rectangle函數

class Rectangle():
    def __init__(self,length,width): self.width,self.length = width,length
   
    @property  #定義getter裝飾器
    def len(self):
        print("execute getLen")
        return self.length
       
    @len.setter   #定義setter裝飾器
    def len(self,length):
        print("execute setLen")
        self.length=length
       
    @len.deleter  #定義deleter 裝飾器
    def len(self):self.length=0

2.    定義實例對象並執行相關操做(交互模式下執行)測試

rect = Rectangle(5,3)
rect.len  #獲取長方形的長
rect.len=10 #設置長方形的長
rect.len  #獲取長方形的長
del rect.len #刪除長方形的長

從下面的執行截圖可看出,相關操做都是調用對應的方法執行,只是方法的名字必須是固定的屬性名。
3、    案例截圖
 
4、    異常狀況的代碼和截圖
與《第7.25節 Python案例詳解:使用property函數定義與實例變量同名的屬性會怎樣?》同樣,老猿也測試了屬性名相同時的異常狀況,證明該異常狀況與7.25節介紹的異常狀況徹底同樣。相關代碼和執行的部分截圖以下:code

#property裝飾器設置與類變量的同名屬性 
class Rectangle():
    def __init__(self,length,width): self.width,self.length = width,length
   
    @property
    def length(self):
        print("execute getLen")
        return self.length
       
    @length.setter    
    def length(self,length):
        print("execute setLen")
        self.length=length
    @length.deleter
    def length(self):self.length=0
       
rect = Rectangle(5,3)

執行截圖:對象

經過以上代碼的執行在此驗證了屬性名不能與實例變量同名,除非是使用一個自己沒有任何數據操做的實例變量。
本節老猿結合案例詳細介紹了property裝飾器的使用,並舉例說明裝飾器定義的屬性不能和類的實例變量同名,不然可能會引起異常。截止到本節,類和類型的基礎知識講了大部分,還有部分後面再開單獨章節介紹,本章到此結束。

blog

相關文章
相關標籤/搜索