Python property裝飾器詳解

2022-09-21 20:57:17 字數 3440 閱讀 6246

屬性的分類:

1:例項屬性:

最好在__init__(self,...)中初始化

內部呼叫時都需要加上self.

外部呼叫時用instancename.propertyname

2:類屬性:

在__init__()外初始化

在內部用classname.類屬性名呼叫

外部既可以用classname.類屬性名又可以用instancename.類屬性名來呼叫

3:私有屬性:

單下劃線_開頭:只是告訴別人這是私有屬性,外部依然可以訪問更改

雙下劃線__開頭:外部不可通過instancename.propertyname來訪問或者更改,實際將其轉化為了_classname__propertyname

正常情況下,我們對屬性賦值,直接賦值就可以了

class

people(object):

def__init__

(self, name, age):

self.name =name

self.age =age

p1 = people('

張三', 22)

p1.name='李四'

print

(p1.name)

++++++++++++++++++++++result++++++++++++++++++++++++李四

但是如果我們對所賦的值有一定的限制,比如要求名字必須是字串,年齡必須是數字,否則會對方法的呼叫造成影響,這個時候單純的賦值就不能滿足這樣的過濾效果了。既然是條件過濾,那麼這幾條**就需要放在方法裡,所以就有了setname(),getname()這樣的方法,在set方法裡做條件限制,使用的時候是這樣的:

p1 = people('

張三', 22)

p1.set('李四

')print(p1.getname());

這樣其實已經可以了,很滿足功能需要。而用@property是讓這個更簡潔,既保持直接對屬性賦值的方便,又對條件做了限制:

@property

defname(self):

a =self._name

#返回前還可以對資料做處理,比如格式化等

return

[email protected]

defname(self,value):

#在賦值之前新增判斷

ifnot

isinstance(value,str):

#丟擲異常

raise typeerror('

people object.name,name must be a str!')

self._name =valu

呼叫的時候仍然是方便快捷的直接賦值:

p1 = people('

張三', 22);

p1.name='李四'

print

(p1.name)

++++++++++++++++++++++result++++++++++++++++++++++++
李四

總之,@property就是既擁有set、get方法的靈活性,又具有屬性直接賦值取值的簡便性。

既要保護類的封裝特性,又要讓開發者可以使用「物件.屬性」的方式操作操作類屬性,除了使用 property() 函式,python 還提供了 @property 裝飾器。通過 @property 裝飾器,可以直接通過方法名來訪問方法,不需要在方法名後新增一對「()」小括號。

@property 的語法格式如下:

@property

def 方法名(self)

**塊例如,定義乙個矩形類,並定義用 @property 修飾的方法操作類中的 area 私有屬性,**如下:

class

rect:

def__init__

(self,area):

self.

__area =area

@property

defarea(self):

return self.__area

rect = rect(30)

#直接通過方法名來訪問 area 方法

print("

矩形的面積是:

",rect.area)

結果:矩形的面積為: 30

上面程式中,使用 @property 修飾了 area() 方法,這樣就使得該方法變成了 area 屬性的 getter 方法。需要注意的是,如果類中只包含該方法,那麼 area 屬性將是乙個唯讀屬性。

也就是說,在使用 rect 類時,無法對 area 屬性重新賦值,即執行如下**會報錯:

rect.area = 90

print("

修改後的面積:

",rect.area)

執行結果為:

traceback (most recent call last):

file

"c:\users\mengma\desktop\1.py

", line 10, in

rect.area = 90attributeerror: can

't set attribute

而要想實現修改 area 屬性的值,還需要為 area 屬性新增 setter 方法,就需要用到 setter 裝飾器,它的語法格式如下:

@方法名.setter

def 方法名(self, value):

**塊例如,為 rect 類中的 area 方法新增 setter 方法,**如下:

@area.setter

defarea(self, value):

self.

__area = value

再次執行如下**:

rect.area = 90

print("

修改後的面積:

",rect.area)

執行結果:修改後的面積: 90

這樣,area 屬性就有了 getter 和 setter 方法,該屬性就變成了具有讀寫功能的屬性。

除此之外,還可以使用 deleter 裝飾器來刪除指定屬性,其語法格式為:

@方法名.deleter

def 方法名(self):

**塊例如,在 rect 類中,給 area() 方法新增 deleter 方法,實現**如下:

@area.deleter

defarea(self):

self.

__area = 0

然後執行如下**:

del

rect.area

print("

刪除後的area值為:

",rect.area)

執行結果為:刪除後的area值為: 0

參考文章:

python property 私有屬性

加有 變數名 的私有屬性直接訪問不了,用get.和set.方法,提供個介面進行訪問。property的使用 私有屬性,用來簡化訪問私有屬性,提供開放性介面,共外界訪問 class student def init self,name,age self.name name self.age age d...

python property動態屬性方法記錄。

student.get age 如下。from datetime import date,datetime class students def init self,name,birthday self.name name self.birthday birthday defget age self...

python property 的詳細使用方法

property 有兩種使用方式裝飾器方式 官方幫助文件 property fget none,fset none,fdel none,doc none property attribute decorators make defining new properties or modifying e...