7.7 【基础】类的 property 属性¶
在之前的学习中,对象的属性,我们都是通过把变量值赋值给对象本身来实现的。
>>> class Student:pass
...
>>>
>>> s = Student()
>>> s.name = "王炳明"
>>> s.age = 27
直接赋值会存在一个问题,就是无法对属性值进行合法性较验,比如我给 age 赋值的是负数,在业务上这种数据是不合法的。但上面那种写法是无法检查出来的。
>>> s.age = -27
>>> s.age
-27
为了实现属性的合法性校验,Python 引入的 property 属性。
请看下面这段代码
class Student:
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if 0 <= value <= 150:
self._age = value
else:
raise ValueError("Valid value must be in [0, 150]")
此时再对 age 属性进行赋值就会对 value 的值进行合法性检查,小于 0 或者 大于 150 的都是不合法数据。
>>> s = Student()
>>> s.age = -27
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 10, in age
ValueError: Valid value must be in [0, 150]
由此我们知道了 property
,其实是 Python
中一个内置的装饰器,它可以在新式类中把一个函数 改造
成属性。
当你读取属性值时,会进入被
property
装饰的函数。当你对属性进行赋值时,会进入被
@xx.setter
装饰的函数。两个装饰器,一定是
@property
在前面,而@xx.setter
在后