Python @property

以下內(nèi)容來自萬能的互聯(lián)網(wǎng)...

首先教材上的
@property 可以將一個(gè)方法的調(diào)用變成“屬性調(diào)用”紊服,主要用于幫助我們處理屬性的都操作和寫操作,對(duì)于某一個(gè)對(duì)象划乖,可以直接通過:a.salary = 3000族檬。

下面是網(wǎng)上的,講的比較詳細(xì)了拄丰,如果用紙畫畫內(nèi)存圖可能會(huì)更清晰。

在綁定屬性時(shí),如果我們直接把屬性賦值給對(duì)象戈鲁,比如:

p = Person()
p.name= 'Mary'

我們先看個(gè)詳細(xì)的例子(注意雙下劃線name和age定義為私有變量):

class Person(object):
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    def get_age_fun(self):
         return self.__age

    def set_age_fun(self, value):
        if not isinstance(value, int):
            raise ValueError('年齡必須是數(shù)字!')
        if value < 0 or value > 100:
            raise ValueError('年齡必須是0-100')
        self.__age = value

    def print_info(self):
        print('%s: %s' % (self.__name, self.__age))
p = Person('balala',20)
p.__age = 17
print(p.__age) # 17
print(p.get_age_fun()) # 20 

表面上看,上面代碼“成功”地設(shè)置了__age變量 17,但實(shí)際上這個(gè)__age變量和class內(nèi)部的__age變量不是一個(gè)變量嘹叫! 內(nèi)部的__age變量已經(jīng)被Python解釋器自動(dòng)改成了_Person__age婆殿,而外部代碼給p新增了一個(gè)__age變量。 所以調(diào)用 get_age_fun輸出的是初始值

p.set_age_fun(35)
print(p.get_age_fun()) # 35
print(p.print_info()) # balala: 35

我們?cè)偕晕⒄{(diào)整下:
(注意只改變了一個(gè)變量名: 原來的私有屬性 __age 單下劃線為: _age,也可以定義為:age. 解釋:以一個(gè)下劃線開頭的實(shí)例變量名罩扇,比如_age婆芦,這樣的實(shí)例變量外部是可以訪問的,但是喂饥,按照約定俗成的規(guī)定消约,當(dāng)看到這樣的變量時(shí),意思是员帮,"雖然可以被訪問或粮,但是,請(qǐng)視為私有變量捞高,不要隨意訪問氯材。")

class Person(object):
    def __init__(self, name, age):
        self.__name = name
        self._age = age

    def get_age_fun(self):
         return self._age

    def set_age_fun(self, value):
        if not isinstance(value, int):
            raise ValueError('年齡必須是數(shù)字!')
        if value < 0 or value > 100:
            raise ValueError('年齡必須是0-100')
        self._age = value

    def print_info(self):
        print('%s: %s' % (self.__name, self._age))


p = Person('balala',20)
p._age = 17
print(p._age) # 17
print(p.get_age_fun()) # 這里是17 不再是 20,因?yàn)榇藭r(shí)_age是全局變量,外部直接影響到類內(nèi)部的更新值
p.set_age_fun(35)
print(p.get_age_fun()) # 35
print(p.print_info()) # balala: 35

看的出私有和全局的設(shè)置,但是硝岗,上面的調(diào)用方法是不是略顯復(fù)雜氢哮,沒有直接用屬性這么直接簡(jiǎn)單。有沒有可以用類似屬性這樣簡(jiǎn)單的方式來訪問類的變量呢型檀?必須的冗尤,對(duì)于類的方法我們先來看一個(gè)稍微改造的例子:
(稍后我們?cè)偈褂肞ython內(nèi)置的@property裝飾器就是負(fù)責(zé)把一個(gè)方法變成屬性調(diào)用.)
我們進(jìn)入正題:看看@property的妙用之處:

class Person(object):
    def __init__(self, name, age):
        self.__name = name
        self.__age = age

    @property
    def get_age_fun(self):
         return self.__age

    @get_age_fun.setter # get_age_fun是上面聲明的方法
    def set_age_fun(self, value):
        if not isinstance(value, int):
            raise ValueError('年齡必須是數(shù)字!')
        if value < 0 or value > 100:
            raise ValueError('年齡必須是0-100')
        self.__age = value

    def print_info(self):
        print('%s: %s' % (self.__name, self.__age))


p = Person('balala',20)
p.__age = 17
print(p.__age) # 17
print(p.get_age_fun) # 20 注意這里不帶()

#p.set_age_fun(35) 注意不能這樣調(diào)用賦值了
p.set_age_fun = 35 #  這里set_age_fun 就是 聲明的函數(shù)不帶()
print(p.get_age_fun) # 35
print(p.print_info()) # balala: 35

參考文章

https://www.cnblogs.com/phpper/p/10618775.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子生闲,更是在濱河造成了極大的恐慌媳溺,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碍讯,死亡現(xiàn)場(chǎng)離奇詭異悬蔽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)捉兴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蝎困,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人倍啥,你說我怎么就攤上這事禾乘。” “怎么了虽缕?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵始藕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我氮趋,道長(zhǎng)伍派,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任剩胁,我火速辦了婚禮诉植,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昵观。我一直安慰自己晾腔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布啊犬。 她就那樣靜靜地躺著灼擂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪椒惨。 梳的紋絲不亂的頭發(fā)上缤至,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音康谆,去河邊找鬼领斥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沃暗,可吹牛的內(nèi)容都是我干的月洛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼孽锥,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼嚼黔!你這毒婦竟也來了细层?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤唬涧,失蹤者是張志新(化名)和其女友劉穎疫赎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碎节,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捧搞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狮荔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胎撇。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖殖氏,靈堂內(nèi)的尸體忽然破棺而出晚树,到底是詐尸還是另有隱情,我是刑警寧澤雅采,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布爵憎,位于F島的核電站,受9級(jí)特大地震影響婚瓜,放射性物質(zhì)發(fā)生泄漏纲堵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一闰渔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铐望,春花似錦冈涧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至乒验,卻和暖如春愚隧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锻全。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工狂塘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鳄厌。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓荞胡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親了嚎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泪漂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355