背景
装饰器(Decorators),是一种可用于修改其它函数功能的函数,有助于使Python代码更加简短。
给出如下一个Python类的示例:
class CVHub(object):
def __init__(self):
self.age = 0
self.member = 5
cvhub = CVHub()
print(f"cvhub.age={cvhub.age}")
print(f"cvhub.member={cvhub.member}")
通过实例化类,同时访问类中的两个成员变量,得到了以下输出:
cvhub.age=0
cvhub.member=5
乍看之下,貌似也没毛病。但是,当我们对__init__中定义的属性进行更改后,会发生什么情况呢?
cvhub.age = 1
cvhub.member = 500
print(f"cvhub.age={cvhub.age}")
print(f"cvhub.member={cvhub.member}")
此时,得到的输出会变成这个样子:
cvhub.age=1
cvhub.member=500
Terrible! 想象一下,如果系统中所涉及到一些关键的属性被完全的暴露出来,当所有开发人员都知道了相应属性名时,岂不是可以任意的修改?当然也不是每个程序员小哥哥都这么坏,但只要是人就难免会有出错的时候,比如不小心加多了一个小数点" . ",这对实际生产环境有时候是非常致命的。那么,我们有没有什么办法可以给这些重要的不想被开发人员修改的属性加一层”锁“呢(类似Java中设置成Private私有成员变量)?答案就在 @property .
功能
Python中的@property修饰符有两大功能:
- 防止关键属性被任意修改
- 将函数进一步封装,使函数(方法)像属性一样被访问
class CVHub(object):
def __init__(self):
self._age = 0
self._member = 5
@property
def age(self):
return self._age
@property
def member(self):
return self._member
cvhub = CVHub()
print(cvhub.age) # Output >> 0
同上,当我们将两个方法封装上一层装饰器@property时,可以以访问属性的方式来调用方法,同时还能够防止属性被任意修改。比如,此时如果我们尝试修改属性cvhub.age = 1
,系统将会报错:
Traceback (most recent call last):
File "E:/***/test.py", line *, in <module>
cvhub.age = 1
AttributeError: can't set attribute