Python:动态属性 property & setter 以及

2020-07-22  本文已影响0人  dex0423

1. property

>>> 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 实例调用 get_age() 方法获取 age,但是这种方法并不是常规方法,我们习惯用类似于 user.age 这样的方式获取 age;

-- 于是我们引入 property 属性,将 age() 方法变为实例的一个 age 属性,这样就可以通过 user.age 直接调用,代码如下:

>>> 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

>>> 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 实例调用 set_age() 方法赋值于 age,但是这种方法并不是常规方法,我们习惯用类似于 user.age = xxx 这样的方式赋值 age;

-- 于是我们引入 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 __

>>> class User():
...     def __init__(self, name):
...         self.name = name
...
>>>
>>> user = User(name="zhangsan")
>>> print(user.age)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'User' object has no attribute 'age'
>>> 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 属性,所以在实例 user 获取 age 属性时并未报错,而只是反悔了一个 None,这就有效避免了报错;

>>> 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 的方式直接获取初始化参数 dict 字典中 key 为 age 的 value 值 23,同时 dict 中并未有 key 为 gender 的键值对,user.gender 直接返回 None 而并未出现报错;

上一篇 下一篇

猜你喜欢

热点阅读