描述符(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() 这可是property啊,
你要操作的是别人的实例化变量,
不是你自己的啊。。。 self 就是 H 的实例,instance 就是 T 的实例,self 没有 c 属性 本帖最后由 好鱼怕冷 于 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]