成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python學(xué)習(xí)筆記-使用@property、setter、deleter

CarterLi / 3443人閱讀

摘要:在中,我們需要對外暴露一個(gè)成員變量的時(shí)候,我們往往需要對外部輸入的值進(jìn)行判斷,以確保是符合我們的期望的。然后寫一個(gè)用于供外部取得值一個(gè)函數(shù)用于供外部設(shè)置值,并對值進(jìn)行一定的判斷。但是這樣實(shí)現(xiàn)了功能,但是的確使得調(diào)用變得比較麻煩。

在python中,我們需要對外暴露一個(gè)成員變量的時(shí)候,我們往往需要對外部輸入的值進(jìn)行判斷,以確保是符合我們的期望的。

class Student(object):
    age = 20
    
student = Student()
print student.age
student.age = "hello"

上述這種寫法雖然可以取到age屬性,但是同時(shí)也可以對age設(shè)置任意值。所以并不合理。

那怎么解決了,我們可以把a(bǔ)ge變成私有的成員變量。然后寫一個(gè)getter用于供外部取得age值;一個(gè)setter函數(shù)用于供外部設(shè)置age值,并對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í)候我們可以在gettersetter后面定義一個(gè)成員變量age。例如

age = property(age_getter, age_setter)

這樣我們就可以把a(bǔ)ge當(dāng)成一個(gè)Student的屬性來調(diào)用和賦值了。
例如:

student.age = "20"
print student.age

你覺得python只能這么寫getter和setter了,那就圖樣圖森破了。python還有逆天的裝飾器來實(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/38315.html

相關(guān)文章

  • 《你不知道的javascript》筆記_對象&原型

    摘要:上一篇你不知道的筆記寫在前面這是年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響年是向上的一年在新的城市穩(wěn)定連續(xù)堅(jiān)持健身三個(gè)月早睡早起游戲時(shí)間大大縮減,學(xué)會(huì)生活。 上一篇:《你不知道的javascript》筆記_this 寫在前面 這是2019年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響2018年是向上的一年:在新的城市穩(wěn)定、...

    seasonley 評論0 收藏0
  • Python 面向?qū)ο缶幊蘋OP (一) 類,對象,屬性,訪問權(quán)限

    摘要:面向?qū)ο缶幊讨镁幊淌鞘裁创蠹液?,作為小白,最近學(xué)習(xí)了很多編程的知識(shí),因?yàn)槟X容量有限,特此一一按照學(xué)習(xí)順序記錄下來,如果哪里有錯(cuò)誤,還請大神盡快指出,以免誤導(dǎo)他人。。。繼承也允許把一個(gè)派生類的對象作為一個(gè)基類對象對待。 Python面向?qū)ο缶幊讨?OOP編程是什么 大家好,作為小白,最近學(xué)習(xí)了很多Python OOP編程的知識(shí),因?yàn)槟X容量有限,特此一一按照學(xué)習(xí)順序記錄下來,如果哪里有...

    hiyayiji 評論0 收藏0
  • Python OOP 面向?qū)ο缶幊?/b>

    摘要:時(shí)代,如果需要手動(dòng)繼承,如多態(tài)多態(tài)是指,不同的子類對象調(diào)用相同的父類方法,會(huì)產(chǎn)生多態(tài)多樣結(jié)果的編程特性。 參考:黑馬程序員教程 - Python基礎(chǔ) 面向?qū)ο?OOP三大特性,且三個(gè)特性是有順序的: 封裝 繼承 多態(tài) 封裝 指的就是把現(xiàn)實(shí)世界的事務(wù),封裝、抽象成編程里的對象,包括各種屬性和方法。這個(gè)一般都很簡單,不需要多講。 唯一要注意的就是:推薦從小往大開始封裝、開發(fā)類。比如手槍...

    weknow619 評論0 收藏0
  • Python - @property 方法變屬性

    摘要:屬性有三個(gè)裝飾器。當(dāng)屬性只有方法,則為只有只讀屬性。使用規(guī)則只讀屬性只有方法,在方法前加上可讀可寫屬性有和方法,在方法上使用屬性名。 @property @property是內(nèi)置的裝飾器,與普通裝飾器原理是一樣的,只不過返回的不是函數(shù),而是類對象. @property負(fù)責(zé)把一個(gè)方法變成屬性進(jìn)行調(diào)用,保證對參數(shù)進(jìn)行必要的檢查。 屬性有三個(gè)裝飾器:setter、getter、dele...

    Alliot 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<