python使用property和描述器来创建可管理的属性
想要对类中的某个属性添加大小或类型限制,可以使用property和描述器来实现
property
class Car1:
def __init__(self,price):
self.price = price
@property
def price(self):
return self._price
@price.setter
def price(self,value):
if value < 0:
raise ValueError('price can not less than 0')
self._price=value
@price.deleter
def price(self):
raise AttributeError('can not deleter this attribute')
使用@property装饰器将方法属性化,可以赋予属性一定的灵活性。setter和deleter可以给赋值和删除操作添加额外逻辑。
class Car2:
def __init__(self,price):
self.set_price(price)
def get_price(self):
return self._price
def set_price(self,value):
if value <0:
raise ValueError('price can not less than 0')
self._price = value
def del_price(self):
raise AttributeError('can not deleter this attribute')
price = property(fget=get_price, fset=set_price, fdel=del_price)
也可以通过现有的get和set方法来定义property方法集合,在对属性进行操作时property会自动调用相应的方法
描述器
class PriceDescriptor:
def __init__(self,attr_name):
self.attr_name=attr_name
def __get__(self, instance, owner):
if instance is None:
return self
else:
return instance.__dict__[self.attr_name]
def __set__(self, instance, value):
if value < 0:
raise ValueError('price can not less than 0')
instance.__dict__[self.attr_name]=value
def __delete__(self, instance):
del instance.__dict__[self.attr_name]
class Car3:
#在类级别中定义
price=PriceDescriptor('price')
def __init__(self,price):
self.price = price
使用描述器定义属性的额外行为。实现了 get,set,delete的方法的类被定义为描述器。为需要使用的属性注册描述器,在访问或修改属性时会自动调用描述器中的特定方法。