property裝飾器 setter修改器

2021-09-27 06:45:19 字數 3764 閱讀 8228

在python中不建議將屬性設定為私有的,但是如果直接將屬性暴露給外界也是有問題的,比如我們沒有辦法檢查賦給屬性的值是否有效。我們之前的建議是將屬性命名以單下劃線開頭,通過這種方式來暗示屬性是受保護的,不建議外界直接訪問,那麼如果想訪問屬性可以通過屬性的getter(訪問器)和setter(修改器)方法進行對應的操作。如果要做到這點,就可以考慮使用@property包裝器來包裝getter和setter方法,使得對屬性的訪問既安全又方便

class

person()

:def

__init__

(self, name, age)

: self._name = name

self._age = age

defplay

(self)

:if self._age <=16:

print

('%s正在玩飛行棋.'

% self._name)

else

:print

('%s正在玩鬥地主.'

% self._name)

defmain()

: person = person(

'王大錘',12

) person.play(

)# 可以內部呼叫self._name

#print(person.name)會報錯,無法在外部訪問self._name

if __name__ ==

'__main__'

: main(

)

當用@property和@setter即可訪問和修改,name屬性只用了訪問其沒用修改器則無法修改,訪問器的作用是將方法改為屬性。

lass person(

object):

def__init__

(self, name, age)

: self._name = name

self._age = age

# 訪問器 - getter方法

@property

defname

(self)

:return self._name

# 訪問器 - getter方法

@property

defage

(self)

:return self._age

# 修改器 - setter方法

@age.setter

defage(self, age)

: self._age = age

defplay

(self)

:if self._age <=16:

print

('%s正在玩飛行棋.'

% self._name)

else

:print

('%s正在玩鬥地主.'

% self._name)

defmain()

: person = person(

'王大錘',12

) person.play(

) person.age =

22 person.play(

)# person.name = '白元芳' # attributeerror: can't set attribute

if __name__ ==

'__main__'

: main(

)

在接觸python時最開始接觸的**,取長方形的長和寬,定義乙個長方形類,然後設定長方形的長寬屬性,通過例項化的方式呼叫長和寬,像如下**一樣。

class

rectangle

(object):

def__init__

(self)

: self.width =

10 self.height=

20r=rectangle(

)print

(r.width,r.height)

此時輸出結果為10 20

但是這樣在實際使用中會產生乙個嚴重的問題,init中定義的屬性是可變的,換句話說,是使用乙個系統的所有開發人員在知道屬性名的情況下,可以進行隨意的更改(儘管可能是在無意識的情況下),但這很容易造成嚴重的後果。

lass rectangle(

object):

def__init__

(self)

: self.width =

10 self.height=

20r=rectangle(

)print

(r.width,r.height)

r.width=

1.0print

(r.width,r.height)

以上**結果會輸出寬1.0,可能是開發人員不小心點了乙個小數點上去,但是會系統的資料錯誤,並且在一些情況下很難排查。

這是生產中很不情願遇到的情況,這時候就考慮能不能將width屬性設定為私有的,其他人不能隨意更改的屬性,如果想要更改只能依照我的方法來修改,

class

rectangle

(object):

@property

defwidth

(self)

:#變數名不與方法名重複,改為true_width,下同

return self.true_width

@property

defheight

(self)

:return self.true_height

s = rectangle(

)#與方法名一致

s.width =

1024

s.height =

768print

(s.width,s.height)

@property使方法像屬性一樣呼叫,就像是一種特殊的屬性)

此時,如果在外部想要給width重新直接賦值就會報attributeerror: can』t set attribute的錯誤,這樣就保證的屬性的安全性。

class

rectangle

(object):

@property

defwidth

(self)

:# 變數名不與方法名重複,改為true_width,下同

return self.true_width

@width.setter

defwidth

(self, input_width)

: self.true_width = input_width

@property

defheight

(self)

:return self.true_height

@height.setter

#與property定義的方法名要一致

defheight

(self, input_height)

: self.true_height = input_height

s = rectangle(

)# 與方法名一致

s.width =

1024

s.height =

768print

(s.width,s.height)

內建裝飾器 property

使用 property 閱讀 4164 內建裝飾器 property的基本功能就是把類中的方法當作屬性來訪問 在繫結屬性時,如果我們直接把屬性暴露出去,雖然寫起來很簡單,但是,沒辦法檢查引數,導致可以把成績隨便改 s student s.score 9999這顯然不合邏輯。為了限制score的範圍,...

property裝飾器詳解

property裝飾器,看了好幾個教程都不太理解,知道發現了知乎的這篇好文python property的介紹與使用,終於懂了!下面結合github上的乙個例子,解釋一下這個裝飾器 class person object def init self,name,age 初始化 self.name na...

物件property裝飾器

class people def init self,name self.name name property defname self obj1.name return self.name name.setter defname self,val obj1.name egon iftype val...