摘要:在中,我們需要對(duì)外暴露一個(gè)成員變量的時(shí)候,我們往往需要對(duì)外部輸入的值進(jìn)行判斷,以確保是符合我們的期望的。然后寫(xiě)一個(gè)用于供外部取得值一個(gè)函數(shù)用于供外部設(shè)置值,并對(duì)值進(jìn)行一定的判斷。但是這樣實(shí)現(xiàn)了功能,但是的確使得調(diào)用變得比較麻煩。
在python中,我們需要對(duì)外暴露一個(gè)成員變量的時(shí)候,我們往往需要對(duì)外部輸入的值進(jìn)行判斷,以確保是符合我們的期望的。
class Student(object): age = 20 student = Student() print student.age student.age = "hello"
上述這種寫(xiě)法雖然可以取到age屬性,但是同時(shí)也可以對(duì)age設(shè)置任意值。所以并不合理。
那怎么解決了,我們可以把a(bǔ)ge變成私有的成員變量。然后寫(xiě)一個(gè)getter用于供外部取得age值;一個(gè)setter函數(shù)用于供外部設(shè)置age值,并對(duì)age值進(jìn)行一定的判斷。
例如:
class Student(object): def __init__(self): self._age = None def age_getter(self): return self._age def age_setter(self, age): if isinstance(age, str) and age.isdigit(): age = int(age) else: raise ValueError("age is illegal") if isinstance(age,int): self._age = age
那么我就需要student.age_getter()取得age,student.age_setter()設(shè)置age值。但是這樣實(shí)現(xiàn)了功能,但是的確使得調(diào)用變得比較麻煩。有什么地方可以改進(jìn)嗎?
這個(gè)時(shí)候我們可以在getter和setter后面定義一個(gè)成員變量age。例如
age = property(age_getter, age_setter)
這樣我們就可以把a(bǔ)ge當(dāng)成一個(gè)Student的屬性來(lái)調(diào)用和賦值了。
例如:
student.age = "20" print student.age
你覺(jué)得python只能這么寫(xiě)getter和setter了,那就圖樣圖森破了。python還有逆天的裝飾器來(lái)實(shí)現(xiàn)getter、setter、和deleter。
例如:
class Student(object): def __init__(self): self._age = None @property def age(self): return self._age @age.setter def age(self, age): if isinstance(age, int): self._age = age return if isinstance(age, str) and age.isdigit(): age = int(age) self._age = age else: raise ValueError("age is illegal") @age.deleter def age(self): del self._age student = Student() student.age = 20 print student.age del student.age
上面的例子中用@property、x.setter x.deleter實(shí)現(xiàn)了屬性的讀取、賦值、和刪除。當(dāng)然您也可以只是實(shí)現(xiàn)其中的一個(gè)或者幾個(gè)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/38315.html
摘要:上一篇你不知道的筆記寫(xiě)在前面這是年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響年是向上的一年在新的城市穩(wěn)定連續(xù)堅(jiān)持健身三個(gè)月早睡早起游戲時(shí)間大大縮減,學(xué)會(huì)生活。 上一篇:《你不知道的javascript》筆記_this 寫(xiě)在前面 這是2019年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響2018年是向上的一年:在新的城市穩(wěn)定、...
摘要:面向?qū)ο缶幊讨镁幊淌鞘裁创蠹液茫鳛樾“祝罱鼘W(xué)習(xí)了很多編程的知識(shí),因?yàn)槟X容量有限,特此一一按照學(xué)習(xí)順序記錄下來(lái),如果哪里有錯(cuò)誤,還請(qǐng)大神盡快指出,以免誤導(dǎo)他人。。。繼承也允許把一個(gè)派生類(lèi)的對(duì)象作為一個(gè)基類(lèi)對(duì)象對(duì)待。 Python面向?qū)ο缶幊讨?OOP編程是什么 大家好,作為小白,最近學(xué)習(xí)了很多Python OOP編程的知識(shí),因?yàn)槟X容量有限,特此一一按照學(xué)習(xí)順序記錄下來(lái),如果哪里有...
摘要:時(shí)代,如果需要手動(dòng)繼承,如多態(tài)多態(tài)是指,不同的子類(lèi)對(duì)象調(diào)用相同的父類(lèi)方法,會(huì)產(chǎn)生多態(tài)多樣結(jié)果的編程特性。 參考:黑馬程序員教程 - Python基礎(chǔ) 面向?qū)ο?OOP三大特性,且三個(gè)特性是有順序的: 封裝 繼承 多態(tài) 封裝 指的就是把現(xiàn)實(shí)世界的事務(wù),封裝、抽象成編程里的對(duì)象,包括各種屬性和方法。這個(gè)一般都很簡(jiǎn)單,不需要多講。 唯一要注意的就是:推薦從小往大開(kāi)始封裝、開(kāi)發(fā)類(lèi)。比如手槍...
摘要:屬性有三個(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、dele...
閱讀 649·2021-11-25 09:43
閱讀 1920·2021-11-17 09:33
閱讀 834·2021-09-07 09:58
閱讀 2068·2021-08-16 10:52
閱讀 490·2019-08-30 15:52
閱讀 1730·2019-08-30 15:43
閱讀 996·2019-08-30 15:43
閱讀 2934·2019-08-29 16:41