@property的使用:对属性的控制和保护
一、保护变量,防止被修改
@property的首要目的是在访问私有变量时,保护变量不被随意修改
class People(object):
def __init__(self, name, age):
self.name = name
self._age = age
@property
def people_age(self):
return self._age # 返回私有属性值
客户端在不清楚age属性变量名的前提下,只能通过People.people_age获取age属性值,同时无法修改该属性。
people = People(name='Tom', age=13)
print(people.name) # 一般属性直接访问
print(people._age) # 私有属性不恰当访问,客户端是不知道_age这个变量名的
print(people.people_age) # 私有属性正确访问,客户端只知道通过,people_age这个变量名获取_age这个属性
# people.people_age = 1 # 同时,该属性无法被修改,执行该语句会报错
但客户端如果知道age属性的变量名是_age,则可以直接修改属性值。
people._age = 2
print(people.people_age) # 2
二、控制变量属性值的改变
为了能够让客户端正确改变属性值,提供了setter和deleter两个方法,对私有属性的赋值和删除进行了限制。
class People(object):
def __init__(self, name, age):
self.name = name
self._age = age
@property
def people_age(self):
return self._age # 返回私有属性值
@people_age.setter
def people_age(self, value):
if 0 < value < 99:
self._age = value
@people_age.deleter
def people_age(self):
if self._age < 10:
del self._age
初始化
people = People(name='Tom', age=13)
(1)限制赋值
# 赋值
people.people_age = 13 # 修改数值在0到99之间,客户端可以成功修改这个属性
print(people.people_age)
people.people_age = 101 # 修改数值超过99,客户端修改失败,防止客户端随意更改
print(people.people_age)
13
101 must be between 0 and 99
13
(2)限制删除
# 删除
del people.people_age # 删除属性失败,因为年龄大于10岁
print(people.people_age)
people.people_age = 3
del people.people_age # 删除属性成功,因为年龄小于10岁
# print(people.people_age) # 报错,属性已经消失
13
欢迎关注~ SandQuant 专注于全球金融数据和量化投资策略