@property
-
@property
是内置的装饰器,与普通装饰器原理是一样的,只不过返回的不是函数,而是类对象. -
@property
负责把一个方法变成属性进行调用,保证对参数进行必要的检查。 - 属性有三个装饰器:
setter
、getter
、deleter
。当属性只有getter
方法,则为只有只读属性。否则为可读写属性。
定义一个类:
class Student(object):
def __init__(self,score):
self.__score = score ## __score 翻译成 _Student__score
# 允许外部代码获取score
def get_score(self):
print('%s'%self.__score)
return self.__score
上述例子中,在绑定属性的时候,直接把属性暴露出去,导致可以随意修改,但是对score的修改又没有做校验限制等。
为了限制属性,例如score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩。
例如:
class Student(object):
def get_score(self):
return self.score
def set_score(self,value):
if not isinstance(value,int): # 先判断输入字符的类型
raise ValueError('score must be an integer')
if value <0 or value >100: # 输入的int数据,判断输入的范围
raise ValueError('score must between 0 -100 ')
self.score = value
试运行:
>>> s = Student() # 不需要s=Student(60),因为没有init方法
>>> s.set_score (60)
>>> s.get_score()
60
>>> s.set_score(101)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in set_score
ValueError: score must between 0 -100
所以,有没有既能检查参数,又可以用类似属性这样简单的方式来访问、判断类的变量呢?
是否还记得装饰器decorator
可以给函数动态加上功能?对于类的方法,装饰器一样起作用。
使用规则:
- 只读属性:只有getter方法,在方法前加上@property;
- 可读可写属性:有getter和setter方法,在setter方法上使用@属性名.setter。
例如:
class Student(object):
# score:可读可写属性, getter与setter方法
# 把一个getter方法变成属性,只需要加上@property就可以了
@property
def score(self):
return self._score
# 创建另一个装饰器@score.setter,负责把一个setter方法变成属性赋值
@score.setter
def score(self,value):
if not isinstance(value,int):
raise ValueError('score must be an integer ! ')
if value<0 or value>100:
raise ValueError ('score must between 0 - 100 ! ')
self.score = value
# 定义只读属性,只定义getter方法
@property
def age(self):
return self._age
❤ thanks for watching, keep on updating...
点个赞再走吧