為什么要寫這篇文章
其實是因為最近學到了python的property裝飾器的相關知識,剛開始學得云里霧里,于是乎,看了許多相關博客,不巧,大概是自己基礎不太好吧,真心感覺許多人寫的太過深奧,而且不是很全面,于是本人花了整整一下午實驗,現在將關于property的相關知識分享出來,如有錯誤之處,還望各位不吝賜教!
什么是property裝飾器
顧名思義,這是一個裝飾器,起到一個輔助作用,具體理解請看下面一個例子,我們知道,程式中有許多變數都有范圍的限制,比如年齡,工資,身高等不可能為負數,但是用戶輸入時,有時會不可避免地輸入非法的值,如果我們的程式沒有一個判斷,那么極有可能導致整個程式崩潰!因此,我們常常會寫一些set(),get()等函式來判斷,但常常會過于麻煩,這時,便出現了property裝飾器,它既有判斷的功能,而且非常簡潔,
set()和get()的使用
class A:
def set_age(self, age):
if 0 < age < 120:
self.age = age
else:
print("非法的年齡!默認為18")
self.age = 0
def get_age(self):
return self.age
a = A()
a.set_age(19)
print(a.age)
a.set_age(180)
print(a.age)
結果如下:
19
非法的年齡!默認為18
0
不可否認,這樣確實達到了我們想要的效果,事實上,Java語言就是這樣實作的,但是python具有更簡潔的表達,就是property裝飾器,
property裝飾器的使用
class A:
@property
def age(self):
return self._age
@age.setter
def age(self, age):
if 0 < age < 120:
self._age = age
else:
self._age = 18
print("非法的年齡!默認為18")
a = A()
a.age = 19
print(a.age)
a.age = 180
print(a.age)
這里的@property相當于get()方法,@age.setter相當于set()方法,
好處
1.property裝飾器將set()和get()方法變成了屬性!可以用 .age 來設定值,不需要用括號,方便更改,
2.增加了新的功能------只讀,如果你只寫@property而不寫@age.setter,那么這個變數就是只讀的,重新賦值則會報錯,增加了程式的安全性,
3.注意到property修飾的是私有成員,而私有成員本來相對來說更安全一點,這體現了代碼的一致性,
注意事項
1.如果你要使修飾的成員只讀,則必須在定義時就設定好值,否則會報錯,
2.property裝飾器只能修飾私有成員,如果修飾非私有成員,則會報回圈的錯誤,結果確實是這樣,但原因不太清楚,煩請大佬們不吝賜教!
3.setter前的變數必須是property修飾的變數,如本例中是age,二者必須一致,
寫在最后
希望這篇文章能夠幫助到您!
打字不易,如果這篇文章有幫助到您,我非常開心!同時也希望您能不吝地點一個贊,說不定會幫助到更多的人,
歡迎所有朋友們批評指正,謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/272492.html
標籤:python
