python 描述符@property
程序员文章站
2022-06-08 15:37:46
...
一、python对象属性
1、正常变量
对象可对变量动态赋值
2、保护变量
变量或方法名以_开始,需通过API设置和修改
3、私有变量
变量或方法名以__开始,类内部调用,子类也无法调用
二、获取和设置类属性
1、自定义set_attr和get_attr
class People(object):
def __init__(self, name):
self.name = name
pass
if __name__=="__main__":
p = People('test')
p.name = '1111111111'
print(p.name)
姓名为数字显然不符合我们的预期,如果我们要限制姓名为英文字符,我们可以为People添加set_name和get_name方法,如下:
class People(object):
def __init__(self, name):
self._name = name
def get_name(self):
return self._name
def set_name(self, val):
# 对val进行判断
self._name = val
虽然达到了限制用户输入的目的,但是每次设置都得调用obj.set_name,obj.get_name方法,很麻烦。
2、 使用@property
python内置的property可以把类方法设置为属性,使用@property相当于实现了getattr,同时实现了@attr.setter的装饰器,@attr.setter负责设置属性的值,如果不实现@attr.setter则属性为只读。
class People(object):
def __init__(self, name, birth):
self._name = name
self._age = 0
self.birth = birth
@property
def name(self):
return self._name
@name.setter
def name(self, val):
# 判断val
self._name = val
@property
def age(self):
return 2019 - self.birth
if __name__ == "__main__":
p = People('test', 1990)
p.name = 'zhangsan'
print(p.name)
p.age = 22
运行结果:
p.age = 22 AttributeError: can't set attribute
zhangsan