“属性”方法修饰器
这是一个Python内置的一个修饰器, 它能让方法像属性一样接受参数,和像属性一样返回参数
作用: 如果一个类中有一个属性,我们希望它只能接受某个范围内的值, 我们需要用一个方法来实现它, 但输入的时候希望它像一个属性一样,而不是像方法一样输入, 这时候我们就可以用@property来实现
工作原理: “属性”是两个同名方法,只是在操作上看来像属性
@property :属性返回值 作用:@property 修饰器修饰的方法是用来定义”属性”的返回值 @xxx.setter:属性赋值 作用:@xxx.setter 修饰器修饰的方法是用来定义”属性”的赋值(参数) (xxx是 “属性” 的名字)
@property:定义属性的返回值
这个修饰器所修饰的方法,是不能接受参数的(除了self是必备的) 通过这个修饰器的修饰的方法, 我们可以定义”属性”在返回前做的动作,和如何进行返回
注意:这个”属性”目前只能返回,不能赋值
class ClassName(object):
@property # 创建一个名字为var的"属性"返回方法
def var(self):
print("这是一个常数", end = "")
self.__var = 20
return self.__var
obj = ClassName()
print(obj.var) # 读取"属性"var的值(本质是运行了一个函数)
print(type(obj.var)) # 读取"属性"var的数据类型
try:
obj.var = 10 # 如果尝试去赋值会引发异常
except AttributeError as e:
print("引发异常-AttributeError:",e)
# 输出
#===============================
这是一个常数:20
这是一个常数:<class 'int'>
引发异常-AttributeError: can't set attribute
@xxx.setter:属性赋值
如果我们希望这个属性能被赋值,需要用到另一个修饰器@xxx.setter 这个修饰器是由@property生成的 通过这个修饰器的修饰的方法, 我们可以定义”属性”在赋值之后的动作,而赋值所赋的值就方法的参数
注意:@xxx.setter必须配合@property使用 注意:xxx 是两个方法的名字,也是”属性”的名字
class ClassName(object):
@property # 创建一个名字为var的"属性"返回方法
def var(self):
print("正在返回变量var的值:", end = "")
return self.__var
@var.setter # 创建一个名字为var的"属性"赋值方法
def var(self, i):
print("正在给变量var赋值")
self.__var = i
obj = ClassName()
obj.var = 10 # 对 "属性" 进行赋值
# 因为已经定义了@xxx.setter"属性"的赋值方法了,
# 所以不会再引发异常了
print(obj.var) # 读取"属性"var的值(本质是运行了一个函数)
print(type(obj.var)) # 读取"属性"var的数据类型
# 输出
#===============================
正在给变量var赋值
正在返回变量var的值:10
正在返回变量var的值:<class 'int'>