鱼C论坛

 找回密码
 立即注册
查看: 857|回复: 3

描述符(property的原理)

[复制链接]
发表于 2020-4-12 19:05:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小甲鱼在讲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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-12 19:16:23 | 显示全部楼层
这可是property啊,
你要操作的是别人的实例化变量,
不是你自己的啊。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-12 19:16:39 | 显示全部楼层
self 就是 H 的实例,instance 就是 T 的实例,self 没有 c 属性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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__方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-21 06:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表