python使用property和描述器来创建可管理的属性

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)

也可以通过现有的getset方法来定义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的方法的类被定义为描述器。为需要使用的属性注册描述器,在访问或修改属性时会自动调用描述器中的特定方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值