Python 動態屬性的概念可能會被面試問到,在項目當中也非常實用,但是在一般的編程教程中不會提到,可以進修一下。
先看一個簡單的例子。創建一個 Student 類,我希望通過實例來獲取每個學生的一些情況,包括名字,成績等。成績只有等到考試結束以后才會有,所以實例化的時候不會給它賦值。
classStudent:def__init__(self,name):self.name=nameself.score=Nonemike=Student('mike')
考試完以后,準備給 mike 打分:
mike.score=999
在這里,老師一不小心多打了個 9 ,通常來說打分都是 100 分值,999 是一個非法數據,不應該賦值成功。學生一多,老師打分出現手誤的情況肯定會越來越多,所以我們必須想辦法修改程序,限制 score 的值必須在 0-100 分。
我們定義一個方法,如果輸入的不是 0-100 的整數,就讓程序報錯,數據合法,我們就把 score 屬性修改成功。
defset_score(self,new_score):ifnotisinstance(new_score,int):raiseValueError('scoremustbeint')if0<=new_score<=100:self.score=new_scorereturnself.scoreelse:raiseValueError('scoreinvalid')
這樣我們每次需要獲取成績的時候使用 self.score 獲取,修改成績的時候調用函數來修改:
mike.set_score(999)
調用以后會報錯,因為 999 是非法數據。注意,這個時候我使用 self.score 還是可以進行設置,而且不報錯:
self.score=999
這顯然是不行的。所以我們要提供一種機制,把 score 變成私有屬性,不能讓外部訪問。很遺憾,python 的私有屬性是偽私有。通常我們把 _
開頭的屬性叫私有屬性,但是這只是一種協議和規定,你看到下劃線開頭的屬性,不要去訪問了。你硬要訪問,是可以的,python 并不會禁止。
上面的方法雖然實現了功能,但是改變了屬性的使用方式。平常是這樣使用的:
#獲取屬性a=mike.score#設置屬性mike.score=99@propertydefscore(self):returnself._score@score.setterdefscore(self,new_score):ifnotisinstance(new_score,int):raiseValueError('scoremustbeint')if0<=new_score<=100:self._score=new_scorereturnself._scoreelse:raiseValueError('scoreinvalid')
統一了調用方式。self.score = 99 的方式,而不是函數調用的方式。
_score
我們就不直接去使用了。你要用也可以,不建議。
如果我們一個屬性只可以讀,把 setter 部分注釋掉就可以了。
現在我們來完善這個類,添加 birth 屬性和年齡屬性:
fromdatetimeimportdatetimeclassStudent:def__init__(self,name,birth=1920):self.name=nameself._score=Noneself.birth=birthself.age=datetime.now().year-self.birthmike=Student('mike')print(mike.birth)print(mike.age)
birth 和 age 這兩個是可以根據一個求出另外一個的。存在數據冗余問題。
age 屬性這樣是有問題的。mike 初始化的時候,age 已經被求出來了,如果我在下一年再去訪問 age 屬性,那他就是個錯誤的值??梢酝ㄟ^把 age 設成現在的秒數來驗證:
self.age=datetime.now().secondmike=Student('mike')time.sleep(5)print(mike.age)print(datetime.now().second)
@propertydefage(self):returndatetime.now().year-self.birth
注意,這里不要去設置 @age.setter ,因為他是動態變化的,你修改了會造成數據不一致,它只能作為一個只讀屬性。
@property 作用和應用場景:
@property 優化了屬性讀取和設置的可讀性
需要限制屬性的特征;
只讀屬性。如果屬性只可以讀,不可以寫,用起來很方便。
這個屬性根據一個變化的環境動態改變。
>>>classWatermelon():def__init__(self,price):self._price=price#私有屬性,外部無法修改和訪問defget_price(self):returnself._pricedefset_price(self,new_price):ifnew_price>0:self._price=new_priceelse:raise'error:價格必須大于零'
用property代替getter和setter
>>>classWatermelon():def__init__(self,price):self._price=price@property#使用@property裝飾price方法defprice(self):returnself._price@price.setter#使用@property裝飾方法,當對price賦值時,調用裝飾方法defprice(self,new_price):ifnew_price>0:self._price=new_priceelse:raise'error:價格必須大于零'>>>watermelon=Watermelon(4)>>>>>>watermelon.price4>>>>>>watermelon.price=7>>>>>>watermelon.price7
到此,相信大家對“Python中property屬性的作用是什么”有了更深的了解,不妨來實際操作一番吧!這里是本站網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
(相關資料圖)今天來聊聊關于為啥電腦有些網站打不開,電腦上面有些網站打的開有些網站打不開是什么原因怎么解決_的文章,現在就為大家來簡單介紹下為啥電腦有些網站打不開,電腦上面有些網站打的開有些網站打不開是什么原因怎么解決_,希望對各位小伙伴們有所幫助。1、與IE沖突,下載谷歌等瀏覽器測試一下,如果好用,上淘寶、OO空間,或瀏覽其它網頁時就用這個軟件,這些都是不用IE做內核的,與你用IE不沖突。2、開...
(資料圖)哈嘍小伙伴們 ,今天給大家科普一個小知識。在日常生活中我們或多或少的都會接觸到奧巴馬憑什么獲得諾貝爾獎方面的一些說法,有的小伙伴還不是很了解,今天就給大家詳細的介紹一下關于奧巴馬憑什么獲得諾貝爾獎的相關內容。美國總統奧巴馬摘得2009年諾貝爾和平獎,因其致力和平工作,為世界帶來“對美好未來的希望”,以及他在呼吁減少全球核武器上的努力。挪威諾貝爾委員會對他在加強國際外交和世界人民之間的合作...
以租代購是什么意思?以租代購,顧名思義,是指以租借的形式,來替代采購。以租代購是一種通過租賃來達到財務目標的商業模式。租車購車是一種以商品交易為形式的汽車消費金融業務。它是一種以客戶常租車輛及二手車車輛處置為一體的打包業務為手段,實現客戶分期買車目的的一種汽車消費形式。汽車采用長期租賃模式,每月按月繳納一次租金,租期滿時,汽車產權轉移到顧客名下。以租代購無力償還怎么辦?如果是不能一次還清的話,可以...