[python]:使用描述器的两种用法,装饰器和特殊函数

描述器即主要对属性的设置,获取,删除操作进行绑定,在对属性的处理上能使代码更优雅一丢。实现上主要有两种方式: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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值