在綁定屬性時,如果我們直接把屬性暴露出去,雖然寫起來很簡單,但是,沒辦法檢查參數,導致可以把成績隨便改:
s=Student()s.score=9999
這顯然不合邏輯。為了限制score的范圍,可以通過一個set_score()
方法來設置成績,再通過一個get_score()
來獲取成績,這樣,在set_score()
方法里,就可以檢查參數:
classStudent(object):defget_score(self):returnself._scoredefset_score(self,value):ifnotisinstance(value,int):raiseValueError('scoremustbeaninteger!')ifvalue<0orvalue>100:raiseValueError('scoremustbetween0~100!')self._score=value
現在,對任意的Student實例進行操作,就不能隨心所欲地設置score了:
>>>s=Student()>>>s.set_score(60)#ok!>>>s.get_score()60>>>s.set_score(9999)Traceback(mostrecentcalllast):...ValueError:scoremustbetween0~100!
但是,上面的調用方法又略顯復雜,沒有直接用屬性這么直接簡單。
有沒有既能檢查參數,又可以用類似屬性這樣簡單的方式來訪問類的變量呢?對于追求完美的Python程序員來說,這是必須要做到的!
還記得裝飾器(decorator)可以給函數動態加上功能嗎?對于類的方法,裝飾器一樣起作用。Python內置的@property
裝飾器就是負責把一個方法變成屬性調用的:
classStudent(object):@propertydefscore(self):returnself._score@score.setterdefscore(self,value):ifnotisinstance(value,int):raiseValueError('scoremustbeaninteger!')ifvalue<0orvalue>100:raiseValueError('scoremustbetween0~100!')self._score=value
@property
的實現比較復雜,我們先考察如何使用。把一個getter方法變成屬性,只需要加上@property
就可以了,此時,@property
本身又創建了另一個裝飾器@score.setter
,負責把一個setter方法變成屬性賦值,于是,我們就擁有一個可控的屬性操作:
>>>s=Student()>>>s.score=60#OK,實際轉化為s.set_score(60)>>>s.score#OK,實際轉化為s.get_score()60>>>s.score=9999Traceback(mostrecentcalllast):...ValueError:scoremustbetween0~100!
注意到這個神奇的@property
,我們在對實例屬性操作的時候,就知道該屬性很可能不是直接暴露的,而是通過getter和setter方法來實現的。
還可以定義只讀屬性,只定義getter方法,不定義setter方法就是一個只讀屬性:
classStudent(object):@propertydefbirth(self):returnself._birth@birth.setterdefbirth(self,value):self._birth=value@propertydefage(self):return2015-self._birth
上面的birth
是可讀寫屬性,而age
就是一個只讀屬性,因為age
可以根據birth
和當前時間計算出來。
@property
廣泛應用在類的定義中,可以讓調用者寫出簡短的代碼,同時保證對參數進行必要的檢查,這樣,程序運行時就減少了出錯的可能性。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
據央視財經消息,擁有較高學歷且年輕的育兒嫂、月嫂,這幾年的需求不斷增多,薪酬也不斷上漲。央視財經從北京多家公司了解到,月嫂和育兒嫂月平均工資分別在15000元和7000元左右。相關閱讀:近幾年,月嫂行業發生了很大的變化。據了解,目前越來越多的高學歷人才開始追捧月嫂行業,這是社會發展的必然趨勢,也是勞動力素質升級的必然結果。城鎮居民收入及消費水平的提高為“月嫂”市場奠定發展基...
1、首因效應是指最初接觸到的信息所形成的印象對我們以后的行為活動和評價的影響,實際上指的就是“第一印象”的影響。即人們根據最初獲得的信息所形成的印象不易改變,甚至會左右對后來獲得的新信息的解釋2、近因效應是指當人們識記一系列事 物時對末尾部分項目的記憶效果優于中間部分項目的現象。3、近因效應與首因效應相反,是指交往中最后- -次見面給人留 下的印象,這個印象在對方的腦海中也...
一億越南盾等于多少人民幣2022?越南盾(越南語:??ng, 漢字:銅),越南的貨幣單位。用“?”記號表示。輔幣單位有 hào(毫) 和 xu(樞),1盾=10 hào或100 xu, 由于面值過小,很少使用。通常置于國名后來表示貨幣單位。一些海外越南人,如美籍越南人稱“盾”為“VND”。人民幣(R...