# property装饰器作用和原理
- 我们知道c
# property 装饰器
class Student(object):
@property
def birth(self):
return self._birth
@birth.setter
def birth(self, value):
self._birth = value
@property
def age(self):
return 2014 - self._birth
# birth 是一个可读可写的属性,age是只读属性。
# property装饰器本身可以把getter方法变成属性,同时生成一个@birth.setter装饰器,可以修饰birth变成一个可设置的属性。
# 但要注意这些额外函数的名字和 property 下的一样,例如这里的 birth,age。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 一种古老的用法,使用内置函数property实现如下,和上面的方法一样。
class Animal(object):
def __init__(self, name, age):
self._name = name
self._age = age
self._color = 'Black'
def get_name(self):
return self._name
def set_name(self, value):
if isinstance(value, basestring):
self._name = value
else:
self._name = 'No name'
name = property(fget=get_name, fset=set_name, fdel=None, doc='name of an animal')
def get_age(self):
return self._age
def set_age(self, value):
if value > 0 and value < 100:
self._age = value
else:
self._age = 0
# print 'invalid age value.'
age = property(fget=get_age, fset=set_age, fdel=None, doc='name of an animal')
a = Animal('black dog', 3)
a.name = 'white dog'
a.age = 3
print 'Name:', a.name
print Animal.name.__doc__
print 'Age:', a.age
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36