描述符(Property的原理)


描述符: 将某种特殊类型的类的实例指派给另一个类的属性

特殊类型:实现了以下三个方法中至少一个   

__get__(self, instance, owner)   用于访问属性,返回属性的值

__set__(self, instance, value)    将在属性分配操作中调用,不返回任何内容

__delete__(self, instance)          控制删除操作,不返回任何内容

以上三个方法虽然跟getattr setattr 以及deleteattr很相似,但是这三个方法属于描述符属性的方法。

class MyDecriptor:
    def __get__(self,instance, owner):
        print("getting...", self, instance, owner)

    def __set__(self, instance, value):
        print("setting...", self, instance, value)

    def __delete__(self, instance):
        print("setting...", self, instance)

class Test:
    x = MyDecriptor()

test = Test()
test.x


通过运行,可以分别知道self, instance, owner的值,这对于后期灵活运用描述符有着重要的作用.

运行结果:

getting... <testDes.MyDecriptor object at 0x0000021FECD88A20> <testDes.Test object at 0x0000021FECD97048> <class 'testDes.Test'>


实践:

定义一个温度类,然后定义两个描述符类用于描述摄氏度和华氏度两个属性。 要求两个属性会自动进行转换,也就是说您可以给摄氏度这个属性赋值,然后打印的华氏度属性是自动转换后的结果。

最终代码如下:

class Celsius:
    def __init_(self, value = 26.0):
        self.value = float(value)
    def __get__(self, instance, owner):
        return self.value
    def __set__(self, instance, value):
        self.value = float(value)

class Fahrenheit:
    def __get__(self, instance, owner):
        return instance.cel * 1.8 + 32
    def __set__(self, instance, value):
        instance.cel = (float(value) - 32) / 1.8
class Temperature:
    cel = Celsius()
    fah = Fahrenheit()

temp = Temperature()
temp.cel = 30
print(temp.fah)
temp.fah = 100
print(temp.cel)






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值