【python】@property 的使用

在看源碼的時候遇到了@property ,於是瞭解了下它。

@property 很顯然是個生成器。它主要的功能就是:
將類中的方法當作是屬性使用。
我們可以直接用property來把一個方法當成屬性使用。
例:

class Test(object):

    @property
    def num(self):
        return 99

這個時候 我們就可以直接

>>>a = Test().num
>>>print a 
>>>99

上面只是一個簡單的例子,下面我們再假設一個場景:
我們來建立一個 Person 類,然後Person中 我們需要實現的方法有:

  • 填寫名字
  • 獲取名字
  • 填寫出生年份
  • 獲取出生年份
  • 獲取年齡

那我們現在來用常規的方法實現這個類:

class Person(object):

    def __init__(self):
        self.this_year = 2016

    def set_username(self,name):
        self._name = name

    def get_username(self):
        return self._name

    def set_userbirth(self,birth):
        if brith < 2016:
            slef._birth = birth

    def get_userbirth(self):
        return self._birth

    def get_userage(self):
        return 2016 - self._birth

這是個常規的類,可以看到 我們定義了很多方法 各種 set_xxx, get_xxx的方法來檢測我們的輸入是否合法,然後再獲取到輸入的屬性。那可不可以方便一點,讓我們用屬性的方式來訪問類變量呢。
這時候我們就用到了 我們今天講的 @property。
來個用了@property的例子:

class Person(object):
    def __init__(self):
        self.this_year = 2016

    @property
    def username(self):
        return self._name

    @username.setter
    def username(self,name):
        self._name = name

    @property
    def userbirth(self):
        return self._birth

    @userbirth.setter
    def userbirth(self, birth):
        if birth < 2016 :
            self._brith = birth

    @property
    def age(self):
        return 2016 - self._birth

if __name__ == '__main__':
    a = Person()
    a.username = 'jim'
    print a.username
    a.userbirth = 1999
    print a.userbirth
    print a.age

執行結果:
jim
1999
17

思考:
我在例子裏定義了兩個setter的時候,我使用的時候,函數名一樣的他肯定是先要找函數名一樣的setter,但是我用age的時候也能取到 _birth ,我就很好奇property是怎麼樣尋找的,顯然只要定義過setter的類他都可以找到。生成器返回的一般都是函數啊,我沒有找到property的源碼,有知道的可以一起探討下嗎。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章