鱼C论坛

 找回密码
 立即注册
查看: 1827|回复: 1

关于第46讲的MyProperty 我有点懵逼

[复制链接]
发表于 2017-11-28 21:36:19 | 显示全部楼层 |阅读模式

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

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

x
代码是
>>> class Myproperty:
        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 __del__(instance):
                self.fdel(instance)


>>> class C:
        def __init__(self):
                self._x=None
        def getX(self):
                return self._x
        def setX(self,value):
                self._x=value
        def delX(self):
                del self._x
        x=Myproperty(getX,setX,delX)

>>> c=C()
>>> c.x=4
>>> c.x
4


那么 我的问题是 它是怎么把 class C 的 getX传给MyProperty里__get__()方法的中的instance的
因为我打印了一下 这个instance在return self.fget(instance)的函数里是instance:  <__main__.C object at 0x0000000002B3F898>
表明它是c 它是C()的一个实例化对象 这个实例化对象怎么判断它是getX

我是这么认为的
当c=C()且c.x=4以后 输入了c.x马上会启动Myproperty 而输入c.x回车属于调用的行为 则马上触及__get__()方法 而不是马上把getX赋给fget
如果这样 getX怎么赋给__get__()的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-11-29 10:58:35 | 显示全部楼层
首先说下,第一个类的del函数,忘记加self了。
c.x=4这一步,首先调用了C的x对象。随后因为是=,所以其后回调用x对像的set方法,
set方法回调了C方法里的fset设置了_x的值为4

随后,c.x调用了x的get方法,get方法回调了x的fget方法。获得了_x的值

instance这个参数是将C这个实例传递给其函数的self值。

最后吐槽下。这种问题下次可以debug一下就出来了。估计这是为啥子没人理你的原因了
PS:打这么多字给个好评呗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-26 04:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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