装饰器(decorator)可以给函数动态加上功能吗?对于类的方法,装饰器一样起作用。Python内置
的 @property 装饰器就是负责把一个方法变成属性调用的:
|
1
2
3
4
5
6
7
8
9
10
11
|
class
Student(
object
):
@property
def
score(
self
):
return
self
._score
@score
.setter
def
score(
self
, value):
if
not
isinstance
(value,
int
):
raise
ValueError(
'score must be an integer!'
)
if
value <
0
or
value >
100
:
raise
ValueError(
'score must between 0 ~ 100!'
)
self
._score
=
value
|
@property 的实现比较复杂,我们先考察如何使用。把一个getter方法变成属性,只需要加上 @property 就可以
了,此时, @property 本身又创建了另一个装饰器 @score.setter ,负责把一个setter方法变成属性赋值,于是,我
们就拥有一个可控的属性操作:
|
1
2
3
4
5
6
7
8
|
>>> s
=
Student()
>>> s.score
=
60
# OK,实际转化为s.set_score(60)
>>> s.score
# OK,实际转化为s.get_score()
60
>>> s.score
=
9999
Traceback (most recent call last):
...
ValueError: score must between
0
~
100
!
|
@property ,我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过gett
er和setter方法来实现的。
还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class
Student(
object
):
@
property
def
birth(
self
):
return
self
._birth
@birth.setter
#设置了set和get方法
def
birth(
self
, value):
self
._birth
=
value
@
property
#设置了get方法
def
age(
self
):
return
2014
-
self
._birth
c
=
Student()
c.birth
=
10
;
print
c.age
|
|
1
2
3
4
|
D:\chinaUnicom\Chinese\python.exe D:
/
python
/
test1
/
test3.py
2004
Process finished with exit code
0
|
本文转自 matengbing 51CTO博客,原文链接:http://blog.51cto.com/matengbing/1905757