摘要:屬性有三個(gè)裝飾器。當(dāng)屬性只有方法,則為只有只讀屬性。使用規(guī)則只讀屬性只有方法,在方法前加上可讀可寫(xiě)屬性有和方法,在方法上使用屬性名。
@property
@property是內(nèi)置的裝飾器,與普通裝飾器原理是一樣的,只不過(guò)返回的不是函數(shù),而是類(lèi)對(duì)象.
@property負(fù)責(zé)把一個(gè)方法變成屬性進(jìn)行調(diào)用,保證對(duì)參數(shù)進(jìn)行必要的檢查。
屬性有三個(gè)裝飾器:setter、getter、deleter。當(dāng)屬性只有getter方法,則為只有只讀屬性。否則為可讀寫(xiě)屬性。
定義一個(gè)類(lèi):
class Student(object): def __init__(self,score): self.__score = score ## __score 翻譯成 _Student__score # 允許外部代碼獲取score def get_score(self): print("%s"%self.__score) return self.__score
上述例子中,在綁定屬性的時(shí)候,直接把屬性暴露出去,導(dǎo)致可以隨意修改,但是對(duì)score的修改又沒(méi)有做校驗(yàn)限制等。
為了限制屬性,例如score的范圍,可以通過(guò)一個(gè)set_score()方法來(lái)設(shè)置成績(jī),再通過(guò)一個(gè)get_score()來(lái)獲取成績(jī)。
例如:
class Student(object): def get_score(self): return self.score def set_score(self,value): if not isinstance(value,int): # 先判斷輸入字符的類(lèi)型 raise ValueError("score must be an integer") if value <0 or value >100: # 輸入的int數(shù)據(jù),判斷輸入的范圍 raise ValueError("score must between 0 -100 ") self.score = value
試運(yùn)行:
>>> s = Student() # 不需要s=Student(60),因?yàn)闆](méi)有init方法 >>> s.set_score (60) >>> s.get_score() 60 >>> s.set_score(101) Traceback (most recent call last): File "", line 1, in File " ", line 8, in set_score ValueError: score must between 0 -100
所以,有沒(méi)有既能檢查參數(shù),又可以用類(lèi)似屬性這樣簡(jiǎn)單的方式來(lái)訪(fǎng)問(wèn)、判斷類(lèi)的變量呢?
是否還記得裝飾器decorator可以給函數(shù)動(dòng)態(tài)加上功能?對(duì)于類(lèi)的方法,裝飾器一樣起作用。
使用規(guī)則:
只讀屬性:只有g(shù)etter方法,在方法前加上@property;
可讀可寫(xiě)屬性:有g(shù)etter和setter方法,在setter方法上使用@屬性名.setter。
例如:
class Student(object): # score:可讀可寫(xiě)屬性, getter與setter方法 # 把一個(gè)getter方法變成屬性,只需要加上@property就可以了 @property def score(self): return self._score # 創(chuàng)建另一個(gè)裝飾器@score.setter,負(fù)責(zé)把一個(gè)setter方法變成屬性賦值 @score.setter def score(self,value): if not isinstance(value,int): raise ValueError("score must be an integer ! ") if value<0 or value>100: raise ValueError ("score must between 0 - 100 ! ") self.score = value # 定義只讀屬性,只定義getter方法 @property def age(self): return self._age
? thanks for watching, keep on updating...
點(diǎn)個(gè)贊再走吧
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/42635.html
摘要:一點(diǎn)點(diǎn)小刀刀晚上收到了某招聘軟件的的消息,心里慌的不行。所以在上面的代碼中,我們可以考慮把改為來(lái)更好的看出繼承關(guān)系。定義方法,在被用于循環(huán)時(shí)返回迭代對(duì)象,循環(huán)會(huì)不斷的調(diào)用方法拿到下一個(gè)值,直到終止。 一點(diǎn)點(diǎn)小刀刀 晚上收到了某招聘軟件的HR的消息,心里慌的不行。因?yàn)楹芟霌Q崗位了,可是當(dāng)機(jī)會(huì)來(lái)的時(shí)候,我卻只能表示能力不行。所以要速速的加油了?。?! 開(kāi)始學(xué)習(xí)的分割 日常一點(diǎn)點(diǎn)小雞血!請(qǐng)不要...
摘要:描述符登場(chǎng)什么是描述符一般來(lái)說(shuō),描述符是一個(gè)具有綁定行為的對(duì)象屬性,其屬性的訪(fǎng)問(wèn)被描述符協(xié)議方法覆寫(xiě)。先看如何用描述符來(lái)解決上面邏輯重復(fù)的問(wèn)題。 關(guān)于@property裝飾器 在Python中我們使用@property裝飾器來(lái)把對(duì)函數(shù)的調(diào)用偽裝成對(duì)屬性的訪(fǎng)問(wèn)。 那么為什么要這樣做呢?因?yàn)锧property讓我們將自定義的代碼同變量的訪(fǎng)問(wèn)/設(shè)定聯(lián)系在了一起,同時(shí)為你的類(lèi)保持一個(gè)簡(jiǎn)單的訪(fǎng)問(wèn)...
摘要:測(cè)試對(duì)象是否為某類(lèi)型返回以?xún)?nèi)的倍數(shù)返回是一堆或者當(dāng)為偶數(shù)時(shí)生成一個(gè)新列表將其加入中的,就是用定義的一個(gè)匿名函數(shù),并通過(guò)函數(shù),將其應(yīng)用到列表中的每個(gè)元素。 1.1 使用函數(shù) 在Python中,函數(shù)必須先聲明,然后才能調(diào)用它,使用函數(shù)時(shí),只要按照函數(shù)定義的形式,向函數(shù)傳遞必需的參數(shù),就可以調(diào)用函數(shù)完成相應(yīng)的功能或者獲得函數(shù)返回的處理結(jié)果。 如果函數(shù)有返回值,那么需要在函數(shù)中使用retur...
摘要:于發(fā)表了著名的有害論的論文引起了長(zhǎng)達(dá)數(shù)年的論戰(zhàn)并由此產(chǎn)生了結(jié)構(gòu)化程序設(shè)計(jì)方法。到現(xiàn)在為止面向?qū)ο笠呀?jīng)成為了主流的開(kāi)發(fā)思想。面向?qū)ο蟮某绦蛟O(shè)計(jì)優(yōu)點(diǎn)解決了程序的擴(kuò)展性。 [Python3]Python面向?qū)ο蟮某绦蛟O(shè)計(jì) 一、面向?qū)ο蟮某绦蛟O(shè)計(jì)的由來(lái) 1.第一階段:面向機(jī)器,1940年以前 最早的程序設(shè)計(jì)都是采用機(jī)器語(yǔ)言來(lái)編寫(xiě)的,直接使用二進(jìn)制碼來(lái)表示機(jī)器能夠識(shí)別和執(zhí)行的指令和數(shù)據(jù)。 簡(jiǎn)單來(lái)...
閱讀 3491·2021-09-22 16:00
閱讀 3575·2021-09-07 10:26
閱讀 3153·2019-08-30 15:55
閱讀 2924·2019-08-30 13:48
閱讀 1418·2019-08-30 12:58
閱讀 2238·2019-08-30 11:15
閱讀 1034·2019-08-30 11:08
閱讀 623·2019-08-29 18:41