python_面向对象进阶之属性值的限制
需求:限制属性值age范围在0~88
代码如下:
装饰器@property:把age属性暴漏出去,函数名字就是属性名字
假设只暴露@property下的函数,没有暴露@age.setter下的函数:表示当前这个属性只允许去读,不允许去修改
@age.setter:表示当前age属性允许修改(赋值),其实真正的属性是_age
当只暴露@property下的函数
当我进行修改name的时候报错:AttributeError: can’t set attribute
1、当类中定义了私有属性,实例化对象后,对象调用私有属性会报错
class User:
def __init__(self, age):
# 私有属性
self.__age = age
user = User(10)
print(user.__age)
2、解决方法1:类中定义实例方法,实例方法中return 私有属性
class User:
def __init__(self, age):
# 私有属性
self.__age = age
def fn(self):
return self.__age
user = User(10)
# print(user.__age)
print(user.fn()) # 10
3、解决方法2:通过装饰器@proporty
装饰器@property:把age属性暴漏出去,函数名字就是属性名字
class User:
def __init__(self, age):
# 私有属性
self.__age = age
@property
def age(self):
return self.__age
user = User(10)
print(user.age) # 10
4、装饰器@proporty可以对私有属性进行操作
class User:
def __init__(self, age):
# 私有属性
self.__age = age
@property
def age(self):
return self.__age + 2
user = User(10)
print(user.age) # 10
5、装饰器@property可以对私有属性做保护性,不输出结果
class User:
def __init__(self, age):
# 私有属性
self.__age = age
@property
def age(self):
if self.__age <18:
return '未成年'
else:
return '成年'
user = User(10)
print(user.age) # 未成年
6、装饰器@property和@属性.setter结合使用
假设只暴露@property下的函数,没有暴露@age.setter下的函数:表示当前这个属性只允许去读,不允许去修改
@age.setter:表示当前age属性允许修改(赋值),其实真正的属性是_age
class User:
def __init__(self, age):
# 私有属性
self.__age = age
@property
def age(self):
return self.__age
@age.setter
def age(self,new_age):
self.__age=new_age
user = User(10)
print(user.age) # 10
user.age=30
print(user.age) #30