python property setter_Python:动态属性 property setter 以及 __getattr__ 属性
1. property
引言:
-- 假設(shè)有這樣一個需求,我們需要創(chuàng)建一個 User 類,并初始化 birthday 參數(shù),之后根據(jù) birthday 計算得到年齡;
-- 我們設(shè)計下面的代碼實(shí)現(xiàn)該需求:
>>> from datetime import date, datetime
>>>
>>>
>>> class User():
... def __init__(self, nbirthday):
... self.birthday = birthday
... def get_age(self):
... return datetime.now().year - self.birthday.year
...
>>>
>>> user = User(date(year=1990, month=3, day=5))
>>> age = user.get_age()
>>> print(age)
30
-- 上面的代碼中使用 user 實(shí)例調(diào)用 get_age() 方法獲取 age,但是這種方法并不是常規(guī)方法,我們習(xí)慣用類似于 user.age 這樣的方式獲取 age;
property
-- 于是我們引入 property 屬性,將 age() 方法變?yōu)閷?shí)例的一個 age 屬性,這樣就可以通過 user.age 直接調(diào)用,代碼如下:
>>> from datetime import date, datetime
>>>
>>>
>>> class User():
... def __init__(self, birthday):
... self.birthday = birthday
... @property
... def age(self):
... return datetime.now().year - self.birthday.year
...
>>>
>>> user = User(date(year=1990, month=3, day=5))
>>> print(user.age)
30
2. setter
引言
-- 假設(shè)有這樣一個需求,我們需要創(chuàng)建一個 User 類,初始化屬性 age 默認(rèn)為 0,之后改變 age 的值,并獲取該值;
-- 我們設(shè)計下面的代碼實(shí)現(xiàn)該需求:
>>> class User():
... def __init__(self):
... self.age = 0
... def set_age(self, age):
... self.age = age
...
>>>
>>> user = User("zhang")
>>> user.set_age(30)
>>> print(user.age)
30
-- 上面的代碼中使用 user 實(shí)例調(diào)用 set_age() 方法賦值于 age,但是這種方法并不是常規(guī)方法,我們習(xí)慣用類似于 user.age = xxx 這樣的方式賦值 age;
setter
-- 于是我們引入 setter 屬性,這樣就可以通過 user.age 直接賦值,代碼如下:
>>> class User():
... def __init__(self,):
... self._age = 0
... @ property
... def age(self):
... return self._age
... @age.setter
... def age(self, age_value):
... self._age = age_value
...
>>>
>>> user = User()
>>> user.age = 30
>>> print(user.age)
30
3. __ getattr __
引言
-- 在開發(fā)過程中,我們經(jīng)常需要設(shè)計并獲取類的實(shí)例對象的屬性,但有時會因?yàn)槭韬鲞z漏沒有為類設(shè)計某個屬性,這就導(dǎo)致獲取屬性值的實(shí)收出現(xiàn)報錯,故而造成程序異常甚至崩潰;
-- 如下面的代碼:
>>> class User():
... def __init__(self, name):
... self.name = name
...
>>>
>>> user = User(name="zhangsan")
>>> print(user.age)
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'User' object has no attribute 'age'
__ getattr __ 處理 object has no attribute 報錯
-- 如上面的代碼,User 類并沒有 age 屬性,所以在實(shí)例 user 獲取 age 屬性時遇到報錯,這個時候需要用到 __ getattr __ 解決此問題;
>>> class User():
... def __init__(self, name):
... self.name = name
... def __getattr__(self, item): # 注意:此處 item 不能少
... pass
...
>>>
>>> user = User(name="zhangsan")
>>> print(user.age)
None
-- 在上面的代碼中,User 類并沒有 age 屬性,所以在實(shí)例 user 獲取 age 屬性時并未報錯,而只是反悔了一個 None,這就有效避免了報錯;
__ getattr __ 獲取 dict 類型屬性的 value 值
-- 除了上面的用法,__ getattr __ 還可以用來更好的獲取 dict 類型屬性的 value 值;
-- 比如我們初始化類時給與其一個 dict 字典屬性參數(shù),我們希望可以通過 實(shí)例. 屬性(比如 user.age)的方式直接獲取 dict 字典中 key 為 age 的 value 值;
-- 以下面的代碼為例:
>>> class User():
... def __init__(self, info={}):
... self.info = info
... def __getattr__(self, item):
... if not item in self.info.keys():
... return None
... return self.info[item]
...
>>>
>>> user = User({"name":"zhangsan", "age":23})
>>> print(user.age)
23
>>> print(user.gender)
None
-- 代碼中 user.age 的方式直接獲取初始化參數(shù) dict 字典中 key 為 age 的 value 值 23,同時 dict 中并未有 key 為 gender 的鍵值對,user.gender 直接返回 None 而并未出現(xiàn)報錯;
總結(jié)
以上是生活随笔為你收集整理的python property setter_Python:动态属性 property setter 以及 __getattr__ 属性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 健身减肥多久能看到效果
- 下一篇: 减肥要消耗多少卡路里