描述器即主要对属性的设置,获取,删除操作进行绑定,在对属性的处理上能使代码更优雅一丢。实现上主要有两种方式:1.用描述符对属性进行装饰;2.在类中重写特殊方法,对类中的所有实例属性的操作进行绑定
- 装饰器:@property, @x.setter, @x.deleter
例如对于一个pizza类,有价格,口味,大小,形状等属性,使用描述符装饰price和size:
class Pizza:
def __init__(self,size,shape,price,flavor):
self.size=size
self.shape=shape
self.price=price
self.flavor=flavor
@property
def price(self):
return self._price
@price.setter
def price(self,value):
if value>0 and value<100:
self._price=value
else:
raise ValueError("value must between 0 and 100")
@property
def size(self):
return self._size
@size.setter
def size(self,value):
if value>0 and value<10:
self._size=str(value)+"inch"
else:
raise ValueError("size must between 0 and 10")
if __name__=="__main__":
p=Pizza(8,"circular",80,"spicy")
print(p.size) #8inch
- 使用特殊方法:__get__(),__set__(),__del__(),管理Score实例的属性,在Student类中初始化Score实例
class Score:
def __init__(self,score=0):
self._score=score
def __set__(self, instance, value):
if isinstance(value,int) and value>=0 and value<=100:
self._score=value
else:
raise ValueError("score must be int and between 0-100")
def __get__(self, instance, owner):
return self._score
def __del__(self):
del self._score
def __repr__(self):
return str(self._score)
class Student:
def __init__(self,name,id,chinese,math,english):
self.name=name
self.id=id
self.chinese=Score(chinese)
self.math=Score(math)
self.english=Score(english)
def __repr__(self):
return "name:{},id:{},chinese:{},math:{},english:{}".\
format(self.name,self.id,self.chinese,self.math,self.english)
if __name__=="__main__":
S1=Student("Lisa","1",89,90,96)
S2=Student("CoCo","2",80,87,100)
print(S1) #name:Lisa,id:1,chinese:89,math:90,english:96
print(S2) #name:CoCo,id:2,chinese:80,math:87,english:100