关于Python中 “描述符“ 的理解

这里引用一段代码来试图说明我对描述符的理解

class A():                   #定义关于摄氏度的描述符
    def __init__(self,value = 30.0):
        self.value = float(value)
        
    def __get__(self,instance,owner):  
        return self.value
    
    def __set__(self,instance,value):
        self.value = float(value)
        
class B():             #定义关于华氏度的描述符
    def __get__(self,instance,owner):  #摄氏度转华氏度
        return instance.cel*1.8+32

    def __set__(self,instance,value):  #华氏度转摄氏度
        instance.cel = (float(value)-32)/1.8
        
class T():                 
    cel = A()
    har = B()            #定义摄氏度属性cel与华氏度属性har
#运行结果如下
In[]: a = T()
In[]: a.cel

Out[]: 30.0

In[]: a.har

Out[]: 86.0

In[]: a.har = 70
In[]: a.cel

Out[]: 21.11111111111111

首先明确描述符的定义:
描述符就是一个具有绑定行为的对象属性,其属性访问将由描述符协议中的方法覆盖。这些方法为__get__ 、__set__和__delete__如果这些方法中的任何一个针对某个对象定义,那么它就被认为是一个描述符
__get
_方法是指当前属性的值被取得时则调用该方法
__set__方法是指当前属性的值被修改时则调用该方法
__delete__方法是指当前属性的值被删除时则调用该方法
参数instance表示当前实例化对象
参数owner表示当前实例化对象所属的类

来看代码
当使用a来实例化T类时,此时a内已经含有cel属性
a=T()
a.cel = 30
因为在a实例化T类时,首先自动调用了 A() 类内的__init__()方法,此时已经传值给value,使得a.cel得到value的值为30。

命令行调用a.har属性,返回得到86.0
In[] : a.har
Out[] : 86.0

 def __get__(self,instance,owner):    #B类中__get__方法 属性值被取得时调用
        return instance.cel*1.8+32

这里是因为使用a.har时,自动调用了B类中的__get__()方法,则取得a.har的值
此处函数中的instance参数就是指当前实例a,返回值即是a.cel参与运算的运算结果,即是调用a.har的结果

In[]:a.har = 70
In[]:a.cel
Out[]:21.11111111111
此处修改属性a.har的值,再查看a.cel属性的值,发现随之改变

def __set__(self,instance,value):  #B类中的__set__方法 属性值被修改时调用
        instance.cel = (float(value)-32)/1.8
def __get__(self,instance,owner):   #A类中的__get__方法 属性值被取得时调用
        return self.value

a.har = 70这句语句触发时,标识实例化对象a的属性har值被修改,则此时自动调用har依托的B类中的__set__方法,此时传入函数的参数instance=实例化对象a,value = 70,进行将(70-32)/1.8 的结果赋值给a.cel的操作。
而给a.cel赋值,即调用了cel依托的A类中__set__方法并传入参数value = (70-32)/1.8 ,使得函数内self.value = (70-32)/1.8。
再次查看a.cel的值,则调用cel依托A类中的__get__方法返回当前cel属性的值,即为上赋值给该属性的(70-32)/1.8。

解释代码过程我使用了‘依托’这个词来表示属性与描述符之间的关系,实际上并不能这么理解,但是能力有限,也只能这样描述了。

整个代码过程相当于,使用a来对T类进行实例化时,在T类内含有属性cel与属性har,则实例化对象a含有cel与har两属性。通过cel = A()语句来实现cel与A类描述符的相关联,属性har同理。此时对两属性进行重写函数的操作时,则会自动调用你重写的相关操作的方法

第一次写这种博客,描述能力实在有限,大家愿意看下去的我在这里多谢了。如果理解有什么问题也欢迎大家评论区提出来或者留言,感谢感谢

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值