日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
淺析Python裝飾器中的@property

一、使用@property優(yōu)點

將類方法轉換為類屬性,可以用來直接獲取屬性值或者對屬性進行賦值。

紅寺堡網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、響應式網(wǎng)站開發(fā)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)于2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選創(chuàng)新互聯(lián)

案例分析

例:

 
 
 
 
  1. class Exam(object): 
  2.     def __init__(self, score): 
  3.         self._score = score 
  4.  
  5.     def get_score(self): 
  6.         return self._score 
  7.  
  8.     def set_score(self, val): 
  9.         if val < 0: 
  10.             self._score = 0 
  11.         elif val > 100: 
  12.             self._score = 100 
  13.         else: 
  14.             self._score = val 
  15.  
  16. e = Exam(60) 
  17. print(e.get_score()) 
  18.  
  19. e.set_score(70) 
  20. print(e.get_score()) 

代碼解析:

定義了一個 Exam 類,為了避免直接對 _score 屬性操作,提供了 get_score 和 set_score 方法,這樣起到了封裝的作用,把一些不想對外公開的屬性隱蔽起來,而只是提供方法給用戶操作,在方法里面,可以檢查參數(shù)的合理性等。

Python 提供了 property 裝飾器,被裝飾的方法,可以將其『當作』屬性來用。

例 :

 
 
 
 
  1. class Exam(object): 
  2.     def __init__(self, score): 
  3.         self._score = score 
  4.  
  5.     @property 
  6.     def score(self): 
  7.         return self._score 
  8.  
  9.     @score.setter 
  10.     def score(self, val): 
  11.         if val < 0: 
  12.             self._score = 0 
  13.         elif val > 100: 
  14.             self._score = 100 
  15.         else: 
  16.             self._score = val 
  17.  
  18.  
  19. e = Exam(60) 
  20. print(e.score) 
  21.  
  22. e.score = 90 
  23. print(e.score) 
  24.  
  25. e.score = 200 
  26. print(e.score) 

注:

給方法 score 加上了 @property,于是可以把 score 當成一個屬性來用,此時,又會創(chuàng)建新的score.setter,它可以把被裝飾的方法變成屬性來賦值。

另外,也不一定要使用 score.setter 這個裝飾器,這時 score 就變成一個只讀屬性:

 
 
 
 
  1. class Exam(object): 
  2.     def __init__(self, score): 
  3.         self._score = score 
  4.  
  5.     @property 
  6.     def score(self): 
  7.         return self._score 
  8.  
  9. e = Exam(60) 
  10. print(e.score) 
  11. e.score = 200  # score 是只讀屬性,不能設置值 
  12. print(e.score) 

二、@property的力量

python處理上述問題的方法是使用property??梢赃@樣來實現(xiàn)它。

例 :

 
 
 
 
  1. class Celsius: 
  2.     def __init__(self, temperature = 0): 
  3.         self.temperature = temperature 
  4.  
  5.     def to_fahrenheit(self): 
  6.         return (self.temperature * 1.8) + 32 
  7.  
  8.     def get_temperature(self): 
  9.         print("獲得的值") 
  10.         return self._temperature 
  11.  
  12.     def set_temperature(self, value): 
  13.         if value < -273: 
  14.             raise ValueError("零下273度是不可能的") 
  15.         print("設定值") 
  16.         self._temperature = value 
  17.  
  18.     temperature = property(get_temperature,set_temperature) 

并且,一旦運行,在shell中發(fā)出以下代碼。

 
 
 
 
  1. c = Celsius() 
  2. print(c.temperature) 

創(chuàng)建對象時,將調用init ()方法。此方法的線為self.temperature = temperature。

此分配自動稱為set_temperature()。

2. 屬性的作用。

任何訪問如c.temperature都會自動調用get_temperature()。

例:

 
 
 
 
  1. c.temperature = 37 
  2. print(c.temperature) 
  3. print(c.to_fahrenheit()) 

注:

溫度值存儲在私有變量_temperature中。temperature屬性是一個屬性對象,它提供了與此私有變量的接口。

三、深入了解property

在Python中,property()是一個內置函數(shù),用于創(chuàng)建并返回屬性對象。

語法

 
 
 
 
  1. property(fget=None, fset=None, fdel=None, doc=None) 

參數(shù)解析

fget為獲取屬性值的函數(shù),fset為設置屬性值的函數(shù),fdel為刪除屬性的函數(shù),doc為字符串(如注釋)。從實現(xiàn)中可以看出,這些函數(shù)參數(shù)是可選的。

可以簡單地按照以下方式創(chuàng)建屬性對象。

 
 
 
 
  1. property(fget=None, fset=None, fdel=None, doc=None) 
  2. print(property()) 

1. 屬性對象有三個方法,getter()、setter()和deleter()。

語法:

 
 
 
 
  1. temperature = property(get_temperature,set_temperature) 

用于稍后指定fget、fset和fdel。

 
 
 
 
  1. # 創(chuàng)建空屬性 
  2. temperature = property() 
  3. # 設置 fget 
  4. temperature = temperature.getter(get_temperature) 
  5. # 設置 fset 
  6. temperature = temperature.setter(set_temperature) 

注:

這兩段代碼是等效的。

不定義名稱get_temperature,set_temperature。

因為它們是不必要的,并且會影響類命名空間。為此,在定義getter和setter函數(shù)時重用了名稱temperature。

2. 案例

例:

 
 
 
 
  1. class Celsius: 
  2.     def __init__(self, temperature = 0): 
  3.         self._temperature = temperature 
  4.  
  5.     def to_fahrenheit(self): 
  6.         return (self.temperature * 1.8) + 32 
  7.  
  8.     @property 
  9.     def temperature(self): 
  10.         print("獲得值") 
  11.         return self._temperature 
  12.  
  13.     @temperature.setter 
  14.     def temperature(self, value): 
  15.         if value < -273: 
  16.             raise ValueError("零下273度是不可能的") 
  17.         print("零下273度是不可能的") 
  18.         self._temperature = value 
  19. c=Celsius() 
  20. c.temperature = 37 
  21. print(c.temperature) 

注:

實現(xiàn)是制作屬性的簡單方法和推薦方法。在Python中尋找屬性時,很可能會遇到這些類型的構造。

四、總結

本文基于Python基礎,介紹了@property 如何把方法變成了屬性。通過案例的分析,代碼的展示。介紹了@property的力量,以及提供了相應錯誤的解決方案處理方法。屬性的作用。

歡迎大家積極嘗試,有時候看到別人實現(xiàn)起來很簡單,但是到自己動手實現(xiàn)的時候,總會有各種各樣的問題,切勿眼高手低,勤動手,才可以理解的更加深刻。

代碼很簡單,希望對你學習有幫助。


新聞標題:淺析Python裝飾器中的@property
文章出自:http://www.dlmjj.cn/article/dpidgog.html