鱼C论坛

 找回密码
 立即注册
查看: 2121|回复: 2

第046讲:魔法方法:描述符:摄氏度华氏度问题

[复制链接]
发表于 2020-9-14 13:17:46 | 显示全部楼层 |阅读模式

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

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

x
我自己写了两个分别如下:
=========================第一个=====================
class Hproperty:
    def __get__(self,instance,owner):
        return self.info

    def __set__(self,instance,value):
        self.info = value
        Cproperty.info = (value - 32)/1.8

    def __del__(self,instance):
        del self

class Cproperty:
    def __get__(self,instance,owner):
        return self.info

    def __set__(self,instance,value):
        self.info = value
        Hproperty.info = (value*1.8 + 32)

    def __del__(self,instance):
        del self


class Temperature:
   
     c = Cproperty()
     h = Hproperty()
===========================第二个======================
class Hproperty:
   
    def __init__(self,fget = None,fset = None,fdel = None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
   
    def __get__(self,instance,owner):
        return self.fget(instance)

    def __set__(self,instance,value):
        self.fset(instance,value)

    def __delete__(self,instance):
        self.fdel(instance)

   
class Cproperty:
   
    def __init__(self,fget = None,fset = None,fdel = None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel

        
    def __get__(self,instance,owner):
        return self.fget(instance)

    def __set__(self,instance,value):
        self.fset(instance,value)


    def __delete__(self,instance):
        self.fdel(instance)
   

class Temperature:
    def __init__(self):
        self.cdegree = None
        
    def getH(self):
        return (self.cdegree*1.8+32)

    def setH(self,value):
        self.cdegree = (value-32)/1.8

    def delT(self):
        del self.cdegree

    def getC(self):
        return self.cdegree

    def setC(self,value):
        self.cdegree = value
        
   
    h = Hproperty(getH,setH,delT)
    c = Cproperty(getC,setC,delT)

        
================================================================
我第一个程序运行时,一开始对摄氏度赋值之后,可以得到正确的华氏度值,但是再赋值或者对华氏度赋值时,发现类的属性会覆盖类的方法,导致无法调用方法,只能读取属性。
我以为是描述符程序只能按照property(fget,fset,fdel)这样的程序来依次传入。但是网课上并没有这样,而是类似我的第一种答案,并且似乎连__delete__方法都没有,但是他的方法并没有被属性覆盖。请问为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-14 13:33:33 | 显示全部楼层
class Hproperty:
    def __get__(self,instance,owner):
        return (instance.info*1.8 + 32)

    def __set__(self,instance,value):
        instance.info = (value - 32)/1.8


class Cproperty:
    def __get__(self,instance,owner):
        return instance.info

    def __set__(self,instance,value):
        instance.info = value


class Temperature:
   
     c = Cproperty()
     h = Hproperty()


稍微改了一下。。。第一个是写的很混乱。这个可以实现要求,但是为啥不会被属性覆盖方法呢。好奇怪哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-14 13:41:46 | 显示全部楼层
刚刚又看了一遍课程。发现只要满足三个函数里有一个就是特殊的类了,这点已经可以理解了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 18:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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