python基礎 裝飾器 property

2021-10-08 21:44:47 字數 2295 閱讀 2968

在裝飾器詳解中介紹了裝飾器的基本用法,而python語言中內建了一些裝飾器,本文介紹在類的方法定義中常用的裝飾器:@property。property本質上是裝飾器類,顧名思義用於屬性的提取,其可將方法裝飾成屬性。

下面為乙個用@property進行裝飾的典型例子,例項方法name()在裝飾後可直接通過.name進行呼叫(或者更嚴格的說法:屬性取值)。property類除了提供了__get__方法(即@property的底層函式),還提供了__set____del__函式,因此可以通過同名函式的fun.setterfun.deleter分別進行屬性的重新賦值和屬性的刪除。

class

student

(object):

def__init__

(self, name, age)

: self._name = name # 這裡也可寫成self.name=name

self._age = age # 這裡也可寫成self.age = age

@property

defname

(self)

:return self._name

@name.setter

defname

(self, name)

: self._name = name

@name.deleter

defname

(self, name)

:del self._name

if __name__ ==

'__main__'

: s1 = student(

'mia',18

)print

(s1.name)

# mia

print

(s1._name)

# mia

s1.name =

'lee'

print

(s1.name)

# lee

在利用@property進行方法裝飾時,要特別留意一種錯誤:遞迴呼叫陷阱

如在下面的例子裡,其唯一的區別為在setter中定義的為self.name=name,而非成員變數self._name,此時會迴圈呼叫裝飾後對應的name物件,從而導致錯誤。

class

student

(object):

def__init__

(self, name, age)

: self._name = name

self._age = age

@property

defname

(self)

:return self._name

@name.setter

defname

(self, name)

: self.name = name

if __name__ ==

'__main__'

: s1 = student(

'mia',18

)print

(s1.name)

# mia

print

(s1._name)

# mia

s1.name =

'lee'

# recursionerror: maximum recursion depth exceeded

print

(s1.name)

直觀上看,採用@property裝飾器對函式進行裝飾有如下好處:

(1)將函式屬性化;

(2)隱藏內部變數名稱,從而保護**;

(3)實現了對統一變數取值(get)、賦值(set)和刪除(delete)的統一化。

除此之外,@property裝飾器最大的意義在於其對於多型的支援,即相同介面下不同的類,有的直接用變數實現,有的可以間接計算出來,有的可以在賦值時增加額外的動作等等,但通過@property可以對外提供一致的介面。

【reference】

@property中的遞迴呼叫

python基礎 裝飾器

裝飾器本質就是函式,功能是為其他函式新增附加功能。原則 不修改被修飾函式的源 不修改被修飾函式的呼叫方式 裝飾器的知識儲備 裝飾器 高階函式 函式巢狀 閉包 import time 定義乙個裝飾器計算函式執行時間 def timer func start time time.time res fun...

python基礎 裝飾器

裝飾器形成的過程 最簡單的裝飾器 有返回值的 有乙個引數 萬能引數 裝飾器的作用 原則 開放封閉原則 語法糖 裝飾器的固定模式 import time print time.time 獲取當前時間 time.sleep 10 讓程式在執行到這個位置的時候停一會兒 def timmer f 裝飾器函式...

Python基礎 裝飾器

裝飾器是程式開發中經常會用到的乙個功能,程式開發的基礎知識,用好了裝飾器,開發效率如虎添翼,所以這也是python面試中必問的問題,但對於好多初次接觸這個知識的人來講,這個功能有點繞,這個都不會,別跟人家說你會python,看了下面的文章,保證你學會裝飾器。裝飾器 decorator 首先我們需要知...