自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

神奇的Python Property裝飾器:1行代碼讓Python方法秒變屬性

開發(fā) 后端
用@property修飾的方法,就會被property實例取代。那么如何獲取原始的方法呢?這就要通過property類的如下3個方法:(1)fget:獲取被@property或@property.getter修飾的方法(2)fset:獲取被@property.setter修飾的方法 (3)fdel:獲取被@property.deleter修飾的方法

[[393351]]

1. property裝飾器的基本用法

在講property裝飾器之前,先來看一個例子:

  1. class MyClass: 
  2.     def __init__(self, word): 
  3.         self._word = word 
  4.     def word(self): 
  5.         return self._word 
  6.  
  7. my = MyClass('Hello'
  8. print(my.word()) 
  9. print(my.word) 

執(zhí)行這段代碼,會輸出如下的結(jié)果:

  1. Hello 
  2. <bound method MyClass.word of <__main__.MyClass object at 0x7fee500b61f0>> 

這段代碼的主要功能就是通過word方法返回一個字符串。而最后一行直接訪問了word方法。在Python語言中,任何東西都可視為對象,方法也不例外。所以直接輸出了word方法的對象形式。

不過my.word這種調(diào)用形式,其實也是訪問屬性的方式,所以這段代碼也可以看做將word方法作為屬性使用,而不是獲取word對象本身。因此,如果要想將word方法作為屬性使用,就要使用property裝飾器。下面看一下改進的代碼:

  1. class MyClass: 
  2.     def __init__(self, word): 
  3.         self._word = word 
  4.     # 將word方法變成屬性     
  5.     @property 
  6.     def word(self): 
  7.         return self._word 
  8.  
  9. my = MyClass('Hello'
  10. # 輸出Hello 
  11. print(my.word) 

這段代碼使用@property修飾了word方法,這時就會將word方法直接變成了屬性,所以可以使用my.word形式調(diào)用word方法,運行這段代碼,會輸出Hello。

我們可以看到,只需要1行代碼,就可以將任何一個普通的Python方法變成屬性。

如果用@property修飾方法,那么就不能再當(dāng)做方法調(diào)用了,例如,不能再使用my.word()形式調(diào)用word方法了,否則會拋出如下異常:

2. property裝飾器的原理

可能有很多小伙伴感到很神奇,為何直接用@property修飾方法,就可以將Python方法變成屬性呢?本節(jié)就來詳細描述property裝飾器的原理。

首先要了解property到底是什么,使用下面的代碼輸出property:

  1. print(property) 

輸出結(jié)果如下:

  1. <class 'property'

很明顯,property是一個類。而Python裝飾器其實就是一個語法糖,本質(zhì)上是將Python裝飾器作為函數(shù)使用,并將被修飾器修飾的方法/函數(shù)作為參數(shù)值傳入裝飾器函數(shù)。例如,使用@property裝飾word方法,那么就相當(dāng)于使用下面的代碼包裝word方法:

  1. property(word) 

也就是說,word方法被@property修飾后,就會變成property類的實例。

可以用下面的代碼來演示property裝飾器的原理。在這段代碼中,使用@property修飾了word方法,而new_word方法直接通過創(chuàng)建property實例的方式修飾。

  1. class MyClass: 
  2.     def __init__(self, word): 
  3.         self._word = word 
  4.     @property 
  5.     def word(self): 
  6.         return self._word 
  7.     # 輸出被修飾的word方法的類型     
  8.     print('word:', type(word)) 
  9.  
  10.     def new_word(self): 
  11.         return self._word 
  12.     # 輸出未被修飾的new_word方法的類型      
  13.     print('new_word:', type(new_word)) 
  14.     new_word = property(new_word) 
  15.     print(type(new_word)) 
  16. my = MyClass("android"
  17.  
  18. print(my.word) 
  19. print(my.new_word) 

執(zhí)行這段代碼,會輸出如下內(nèi)容:

從輸出結(jié)果可以看出,被@property修飾的word方法的類型是property類,而未被@property修飾的new_word方法的類型是function類。而且通過創(chuàng)建property實例的方式包裝的new_word方法也可以當(dāng)做屬性使用,與下面的代碼等效:

  1. @property 
  2. def new_word(self): 
  3.     return self._word 

3. 讓屬性可寫、可刪除

用@property修飾的方法是只讀屬性,既不可以寫,也不可以刪除,否則會拋出異常。

如果使用my.word = 'new'設(shè)置word屬性,會拋出如下異常。

如果使用del my.word刪除word屬性,會拋出如下異常:

其實property類還有setter方法和deleter方法,可以將屬性變成可寫和可刪除的,先看下面的代碼:

  1. class MyClass: 
  2.     def __init__(self, word): 
  3.         self._word = word 
  4.     @property 
  5.     def word(self): 
  6.         return self._word 
  7.     # 設(shè)置可寫屬性     
  8.     @word.setter 
  9.     def word(self, value): 
  10.         self._word = value 
  11.     # 設(shè)置可刪除屬性,刪除word屬性時會調(diào)用該方法     
  12.     @word.deleter 
  13.     def word(self): 
  14.         print('delete word'
  15.         self._word = '' 
  16.     # 通過創(chuàng)建property實例的方式將new_word方法變成可讀寫和可刪除的 
  17.     def new_word(self): 
  18.         return self._word 
  19.     # 將new_word變成只讀的屬性,并且需要將property實例賦給一個新的變量,否則會被后面的new_word方法覆蓋 
  20.     new_word1 = property(new_word) 
  21.     def new_word(self, value): 
  22.         self._word = value 
  23.     # 將new_word變成可寫的屬性 
  24.     new_word1 = new_word1.setter(new_word) 
  25.  
  26.     def new_word(self): 
  27.         print('delete new word'
  28.     # 將new_word變成可刪除的屬性 
  29.     new_word = new_word1.deleter(new_word) 
  30.  
  31.  
  32. my = MyClass('hello'
  33.  
  34. print(my.word) 
  35. my.word = 'world'   #  def word(self, value): 
  36. print(my.word) 
  37. del my.word 
  38. print(my.word) 
  39.  
  40. print('---------'
  41. my = MyClass('ios'
  42.  
  43. print(my.new_word) 
  44. my.new_word = 'harmony' 
  45. print(my.new_word) 
  46. del my.new_word 
  47. print(my.new_word) 

執(zhí)行這段代碼啊,會輸出如下內(nèi)容:

4. 獲得原始方法

用@property修飾的方法,就會被property實例取代。那么如何獲取原始的方法呢?這就要通過property類的如下3個方法:

(1)fget:獲取被@property或@property.getter修飾的方法

(2)fset:獲取被@property.setter修飾的方法

(3)fdel:獲取被@property.deleter修飾的方法

在下面的例子中,分別獲取了word屬性的3個原始方法,并且調(diào)用了這3個原始方法

  1. class MyClass: 
  2.     def __init__(self, word): 
  3.         self._word = word 
  4.     @property 
  5.     def word(self): 
  6.         return self._word 
  7.     @word.setter 
  8.     def word(self, value): 
  9.         self._word = value 
  10.     @word.deleter 
  11.     def word(self): 
  12.         print('delete word'
  13.         self._word = '' 
  14.     fget_word = word.fget 
  15.     fset_word = word.fset 
  16.     fdel_word = word.fdel 
  17.  
  18. my = MyClass('android'
  19. print(my.fget_word()) 
  20. my.fset_word('harmony'
  21. print(my.fget_word()) 
  22. print(my.fdel_word()) 

執(zhí)行這段代碼,會輸出如下的結(jié)果。

 

責(zé)任編輯:武曉燕 來源: 極客起源
相關(guān)推薦

2021-04-11 08:21:20

Python@property裝飾器

2021-11-02 16:25:41

Python代碼技巧

2021-01-01 14:36:03

Python開發(fā)語言

2015-12-03 10:03:38

夜神

2024-07-30 14:09:19

裝飾器Python代碼

2020-02-19 15:02:23

代碼開發(fā)工具

2024-11-08 17:22:22

2020-11-17 09:10:44

裝飾器

2017-04-05 11:10:23

Javascript代碼前端

2016-11-01 09:24:38

Python裝飾器

2024-06-03 10:26:47

Python裝飾器對象編程

2023-12-06 13:43:00

python代碼

2010-02-01 17:50:32

Python裝飾器

2021-04-07 13:43:07

PythonDash數(shù)據(jù)庫

2022-02-23 14:37:48

代碼Pythonbug

2019-11-26 09:47:50

代碼開發(fā)工具

2024-05-24 11:36:28

Python裝飾器

2024-03-08 08:00:00

Python開發(fā)裝飾器

2024-01-03 08:12:10

計算求和Python內(nèi)置函數(shù)

2023-02-07 07:47:52

Python裝飾器函數(shù)
點贊
收藏

51CTO技術(shù)棧公眾號