property
@property可以将python定义的方法“当做”属性访问(不用添加()直接类实例.方法名),从而提供更加友好访问方式,但是有时候setter/deleter也是需要的。
- 只有@property表示只读。
- 同时有@property和@被装饰的方法名.setter表示可读可写。
- 同时有@property和@被装饰的方法名.setter和@被装饰的方法名.deleter表示可读可写可删除
class Person(): def __init__(self): self._age = None @property def get_age(self): return self._age @get_age.setter def set_age(self,age): self._age = age if __name__ == "__main__": p1=Person() p1.set_age=23 print(p1.get_age) #23
print(p1.age)#报错没有age属性,这里装饰过后 只能通过p1.get_age获取到age属性 所以一般我们命名用以下方法#不过一般我们不用上述那种命名,直接用属性名字定义方法名 class Student(): def __init__(self): self._score = None @property def score(self): return self._score @score.setter def score(self,value): #### 这里可以加入赋值逻辑 if not isinstance(value,int): raise ValueError('分数必须为整数') if value>100 or value<0: raise ValueError('分数不是合理区间') else: self._score = value @score.deleter def score(self): del self._score if __name__ == "__main__": stu1 = Student() stu1.score = 100 print(stu1.score)
del stu1.score
print(stu1.score)#报错stu1没有score该属性 stu1.score = 101#报错分数不是合理区间如果不加@x.setter表示该属性为只读
-
class Person(): def __init__(self): self._age = 26 @property def age(self): return self._age if __name__ == "__main__": p1 = Person() print(p1.age) p1.age=27 #报错 AttributeError: can't set attribute
print(stu1.score)