通过装饰器,优雅的查看和修改类的私有变量
简介
property : 不可作用于非私有变量,可以为私有变量提供get方法,通过 类.函数名 的方式获取私有变量, 建议函数名和私有变量名称一致
函数名.setter : 函数名需要和 property 设计的函数名一致,不一致则产生异常,同时,setter方法只能针对私有变量进行修改
python代码,通过python3.8验证
class Student:
def __init__(self):
self.name = "童话"
self.__age = 18
# @property
# def name(self):
# return self.name
#
# @name.setter
# def name(self, user_name):
# self.name = user_name
@property # 提供getter方法
def age(self):
return self.__age
# @age.setter
# def age(self, n):
# if n > 18:
# self.__age = n
# else:
# self.__age = 0
# print("年龄输入异常,将重置为0")
@age.setter # 提供setter方法
def age(self, n):
print("私有变量不允许更改")
def getter_age(self):
return self.__age
def setter_age(self, n):
if n > 18:
self.__age = n
else:
self.__age = 0
print("年龄输入异常,将重置为0")
def main():
student = Student()
print(student.name) # 非私有变量使用property和setter方法将产生异常
# 此处的setter方法是注释的方法,需要更换注释
# print(student.age) # 私有变量可以使用property和setter
# student.age = 15 # 此时将直接调用setter方法,将判断年龄是否大于18岁,如果小于18,将重置年龄并打印异常信息
# print(student.age)
# print(student._Student__age)
# 此处的setter方法是没有注释的方法,可以实现私有变量为只读变量的设置
print(student.age)
student.age = 180 # 此处将不会修改age的值,并打印异常信息
print(student.age)
student._Student__age = 180 # 使用不合法的方式仍然可以修改
print(student.age)
# setter和property的功能是优化类的代码块,可以通过直接 类.属性 进行查看和修改
# 使用函数也可以实现下列效果
print(student.getter_age())
student.setter_age(190)
print(student.getter_age())
print(student.age)
if __name__ == '__main__':
main()