“属性”方法修饰器

这是一个Python内置的一个修饰器, 它能让方法像属性一样接受参数,和像属性一样返回参数

作用: 如果一个类中有一个属性,我们希望它只能接受某个范围内的值, 我们需要用一个方法来实现它, 但输入的时候希望它像一个属性一样,而不是像方法一样输入, 这时候我们就可以用@property来实现

工作原理: “属性”是两个同名方法,只是在操作上看来像属性
@property :属性返回值 作用:@property 修饰器修饰的方法是用来定义”属性”的返回值 @xxx.setter:属性赋值 作用:@xxx.setter 修饰器修饰的方法是用来定义”属性”的赋值(参数) (xxx是 “属性” 的名字)


@property:定义属性的返回值

这个修饰器所修饰的方法,是不能接受参数的(除了self是必备的) 通过这个修饰器的修饰的方法, 我们可以定义”属性”在返回前做的动作,和如何进行返回

注意:这个”属性”目前只能返回,不能赋值

  1. class ClassName(object):
  2. @property # 创建一个名字为var的"属性"返回方法
  3. def var(self):
  4. print("这是一个常数", end = "")
  5. self.__var = 20
  6. return self.__var
  7. obj = ClassName()
  8. print(obj.var) # 读取"属性"var的值(本质是运行了一个函数)
  9. print(type(obj.var)) # 读取"属性"var的数据类型
  10. try:
  11. obj.var = 10 # 如果尝试去赋值会引发异常
  12. except AttributeError as e:
  13. print("引发异常-AttributeError:",e)
  1. # 输出
  2. #===============================
  3. 这是一个常数:20
  4. 这是一个常数:<class 'int'>
  5. 引发异常-AttributeError: can't set attribute

@xxx.setter:属性赋值

如果我们希望这个属性能被赋值,需要用到另一个修饰器@xxx.setter 这个修饰器是由@property生成的 通过这个修饰器的修饰的方法, 我们可以定义”属性”在赋值之后的动作,而赋值所赋的值就方法的参数
注意:@xxx.setter必须配合@property使用 注意:xxx 是两个方法的名字,也是”属性”的名字

  1. class ClassName(object):
  2. @property # 创建一个名字为var的"属性"返回方法
  3. def var(self):
  4. print("正在返回变量var的值:", end = "")
  5. return self.__var
  6. @var.setter # 创建一个名字为var的"属性"赋值方法
  7. def var(self, i):
  8. print("正在给变量var赋值")
  9. self.__var = i
  10. obj = ClassName()
  11. obj.var = 10 # 对 "属性" 进行赋值
  12. # 因为已经定义了@xxx.setter"属性"的赋值方法了,
  13. # 所以不会再引发异常了
  14. print(obj.var) # 读取"属性"var的值(本质是运行了一个函数)
  15. print(type(obj.var)) # 读取"属性"var的数据类型
  1. # 输出
  2. #===============================
  3. 正在给变量var赋值
  4. 正在返回变量var的值:10
  5. 正在返回变量var的值:<class 'int'>