phpwl 发表于 2020-4-12 19:05:39

描述符(property的原理)

小甲鱼在讲property的原理的时候,讲了一个实例,在第二个类那里,用到def __get__(self, instance, owner)和def __set__(self, instance, value),底下我不明白为什么只能用instance
这是代码以及我的疑惑
class C:
    def __init__(self,value=0.0):
      self.value = value
    def __get__(self, instance, owner):
      return self.value
    def __set__(self, instance, value):
      self.value = float(value)

class H:
    def __get__(self, instance, owner):
      return instance.c * 1.8 + 32#我不明白这里为什么只能用instance,而不可以用self
    def __set__(self, instance, value):
      instance.c = (float(value) - 32)/1.8#还有这里

class T:
    c=C()
    h=H()

qiuyouzhi 发表于 2020-4-12 19:16:23

这可是property啊,
你要操作的是别人的实例化变量,
不是你自己的啊。。。

zltzlt 发表于 2020-4-12 19:16:39

self 就是 H 的实例,instance 就是 T 的实例,self 没有 c 属性

好鱼怕冷 发表于 2020-5-19 22:17:56

本帖最后由 好鱼怕冷 于 2020-5-19 22:28 编辑

这段程序运行之后,要在操控界面上面给T进行实例化:
t = T()

假如要设置一个摄氏温度为30度,就必须做以下赋值:
t.c = 30
——由于对描述符类C进行了赋值操作,要调用C描述符类的__set__方法,将摄氏温度的value改为30,返回到初始化中。

这时候如果想要显示摄氏温度30度对应的华氏温度,就必须:
t.f
返回86.0
——实际上t.f是对描述符类F进行了提取属性的操作,因而调用F描述符类的__get__方法
——这个__get__方法里面,self:指的是F的实例化对象f;instance:指的是owner的实例化对象t;owner:指的是T这个类。
        ——所以,要renturn的值:instance.c * 1.8 +32= t.c * 1.8 +32
        ——这里边的t.c实际上又调用了C描述符类的__get__方法,来获取此时的摄氏温度值,也就是30
        ——所以整个计算就变成:30*1.8+32 = 86.0

**重点是要搞清楚变量的含义
**只有“.”点操作符的时候,是在调用__get__方法
**进行赋值操作的时候,是在调用__set__方法
页: [1]
查看完整版本: 描述符(property的原理)