Python中操作屬性(添加清蚀,修改,刪除)的方法歸納

Python中操作屬性值的辦法有很多爹谭,我將通過四個實例來循序漸進的說明枷邪。

正文:

我們通常要對屬性進行獲取(getter),修改(setter)诺凡,刪除(deleter)這些操作东揣,比如最簡單的可以這樣實現(xiàn):

### 實例1 ###
class Student(object):
    pass
student = Student()  # 實例化對象

student.name = 'Li'  # 添加/設(shè)置 name屬性
student.name = 'Hu'  # 修改name屬性
student.name        # 取name屬性
'Hu'
del student.name     # 刪除name屬性

我們在實例化student對象后,的確很方便的為實例添加了屬性腹泌,但是問題來了嘶卧。很多時候我們是不希望一個對象的屬性被隨意修改的,而且我們希望對象的屬性值是有效的凉袱,但是通過上面方法芥吟,屬性可能接收到任意值。也就是說绑蔫,我們有時需要對屬性的操作進行限制來避免獲取錯誤的屬性值运沦!

為了對屬性的操作進行限制,得到希望的屬性值配深,我們可以在定義類的時候添加一些方法:

### 實例2 ###
class Student(object):
    def __init__(self):
        self._name = None
    def get_name(self):     # 取屬性
        return self._name
    def set_name(self, n):  # 修改/設(shè)置 屬性
        if not isinstance(n, str):  # 如果傳入的不是字符串 拋出一個異常 可以避免屬性接受非字符串對象
            raise TypeError('Name must be str!')   # raise表達(dá)式用于拋出一個異常
        self._name = n
        
student = Student()
student.set_name('li')  # 正確的設(shè)置屬性
student.get_name()      # 訪問屬性
li
student.set_name(123)   # 錯誤的設(shè)置屬性
TypeError: Name must be str!

這下的確可以限制屬性了携添,但是對于一個Python程序員來說,這還不夠不優(yōu)雅( ̄▽ ̄)"篓叶,因為每次調(diào)用方法顯的有些麻煩烈掠。觀察上面兩個例子羞秤,我們就想:能不能在保證對屬性進行限制的情況下又能像第一個例子中那樣操作屬性呢?Python中的property()函數(shù)滿足了我們的要求:

### 實例3 ###
class Student(object):
    def __init__(self):
        self._name = None
    def get_name(self):
        return self._name
    def set_name(self, value):
        self._name = value
    def del_name(self):
        del self._name
    x = property(get_name,set_name,del_name,"I am the 'x' property.")
student = Student()  # 實例化
student.x = 'Li'    # 相當(dāng)于 student.set_name('Li')
student.x           # 相當(dāng)于 student.get_name
'Li'
del tudent.x        # 相當(dāng)于  del student.name

在上面的代碼中property函數(shù)的原型是:property([fget[, fset[, fdel[, doc]]]])左敌,它將返回新式類屬性瘾蛋。當(dāng)使用student.x = 'Li',相當(dāng)于 student.set_name('Li')矫限;當(dāng)使用student.x哺哼,相當(dāng)于 student.get_name;當(dāng)使用del tudent.x叼风,相當(dāng)于del student.name取董。

這下可以了吧?還沒无宿,利用Python中的裝飾器可以讓我們把上述的代碼寫的更加簡單:

### 實例4 ###
class Student(object):
    def __init__(self):
        self._name = None
    @property
    def name(self):         # 注意 這三個方法名要一樣
        return self._name
    @name.setter                  # 注意 裝飾器名改變
    def name(self, value):  # 注意 這三個方法名要一樣
        self._name = value
    @name.deleter                 # 注意 裝飾器名改變
    def name(self):         # 注意 這三個方法名要一樣
        del self._name
student = Student()
student.name = 'Li'   # 相當(dāng)于 student.set_name('Li')
student.name         # 相當(dāng)于 student.get_name
'Li'
del student.name      # 相當(dāng)于  del student.name

總結(jié):

  • 操作屬性的方法通常包含最基礎(chǔ)的三個:獲取(get)茵汰,修改(set),刪除(del)孽鸡。
  • 可以像操作普遍變量一樣操作屬性蹂午。這樣雖然方便,但是可能會導(dǎo)致屬性被隨意修改彬碱,以及接受一些不正常的值豆胸。
  • 為避免屬性被隨意修改,我們可以在定義類時順便定義方法巷疼,通過方法實現(xiàn)屬性的獲取配乱、修改和刪除。
  • 在定義類中使用property函數(shù)可以使得限制屬性的同時能夠簡單的操作它們皮迟。使用@property語句可以進一步簡化代碼。
  • python簡潔設(shè)計的風(fēng)格從操作屬性這樣一個問題中也可見一斑桑寨!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伏尼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子尉尾,更是在濱河造成了極大的恐慌爆阶,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沙咏,死亡現(xiàn)場離奇詭異辨图,居然都是意外死亡,警方通過查閱死者的電腦和手機肢藐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門故河,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吆豹,你說我怎么就攤上這事鱼的±砼瑁” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵凑阶,是天一觀的道長猿规。 經(jīng)常有香客問我,道長宙橱,這世上最難降的妖魔是什么姨俩? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮师郑,結(jié)果婚禮上环葵,老公的妹妹穿的比我還像新娘。我一直安慰自己呕乎,他們只是感情好积担,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猬仁,像睡著了一般帝璧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上湿刽,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天的烁,我揣著相機與錄音,去河邊找鬼诈闺。 笑死渴庆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雅镊。 我是一名探鬼主播襟雷,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仁烹!你這毒婦竟也來了耸弄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤卓缰,失蹤者是張志新(化名)和其女友劉穎计呈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體征唬,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡捌显,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了总寒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扶歪。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖偿乖,靈堂內(nèi)的尸體忽然破棺而出击罪,到底是詐尸還是另有隱情哲嘲,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布媳禁,位于F島的核電站眠副,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏竣稽。R本人自食惡果不足惜囱怕,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毫别。 院中可真熱鬧娃弓,春花似錦、人聲如沸岛宦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砾肺。三九已至挽霉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間变汪,已是汗流浹背侠坎。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留裙盾,地道東北人实胸。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像番官,于是被迫代替她去往敵國和親庐完。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 〇徘熔、前言 本文共108張圖假褪,流量黨請慎重! 歷時1個半月近顷,我把自己學(xué)習(xí)Python基礎(chǔ)知識的框架詳細(xì)梳理了一遍。 ...
    Raxxie閱讀 18,918評論 17 410
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,320評論 8 265
  • 你有你的實力宁否,我有我的努力窒升; 你有你的優(yōu)勢,我有我的優(yōu)點慕匠; 你有你的魅力饱须,我有我的美麗; 你有你的缺點台谊,我有我的包...
    不以物喜不以己悲的漢子閱讀 142評論 0 0
  • 3月份的簡書沒有堅持寫滿一個月蓉媳,一些外在的事物引發(fā)了內(nèi)在的不快譬挚,我允許自己停下來,給自己一個整理和反思的時間…… ...
    舒窈SY閱讀 267評論 2 0
  • 文/王瑜鑫 秋天是什么時候溜走的呢?我們好像對季節(jié)有鈍感力酪呻,等季節(jié)過了一半才露出恍然大悟的樣子:哦减宣,原來冬天到了。...
    梅鳳閱讀 144評論 0 0