在看源碼的時候遇到了@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的源碼,有知道的可以一起探討下嗎。