面向对象进阶-property装饰器的用法
对属性的值进行限制
之前可以使用 set和get方法
class Person:
# age 属性的值限制 0~88 | 以前可以使用 set 和 get方法
def getAge(self):
return self._age # 下划线表示私有属性
# 如果用户不使用 set 那就不能进行阻止 当然写入的也不是 self._age
def setAge(self, value):
if 0 <= value <= 88:
self._age = int(value)
else:
# raise Exception('age的值在 (0~99) 之间的整数') | 可以抛出异常
print('age的值在 (0~99) 之间的整数')
self._age = 0 # 也可以设置默认值 (但设置默认值感觉不太好)
pass
if __name__ == '__main__':
p = Person()
p.age = 18
print(p.age)
p.age = 100 # 这就不那么好
print('-' * 80)
p.setAge(18)
print(p.getAge()) # 18
p.setAge(100)
print(p.getAge()) # 0 并输出提示信息
现在可以使用 装饰器 @property 与 @age.setter
class Person:
# 直接定义一个与属性名相同的方法
@property # 使用修饰符进行修饰 这是用于获取
def age(self):
return self._age
# 也是直接定义一个与属性名相同的方法
@age.setter
def age(self, value):
if 0 <= value <= 88:
self._age = int(value)
else:
raise Exception('age的值在 (0~99) 之间的整数')
pass
if __name__ == '__main__':
p = Person()
p.age = 18
print(p.age)
p.age = 100
print(p.age)
只读处理 (装饰器 @property)
class Person:
def __init__(self, name='张三'):
self._name = name
# 如果只暴露下面这一个方法 表示只允许读 不能改 (可以在实例化对象时传入初始值, 也可以设置内置)
@property
def name(self):
self._name = '李四'
return self._name
if __name__ == '__main__':
p = Person()
p.name = '张三' # 无法设置属性 'name'
print(p.name)
# p.name = '张三'
print(p.name)
有点短…