鱼C论坛

 找回密码
 立即注册
查看: 3471|回复: 8

property的实现原理

[复制链接]
发表于 2016-7-27 18:48:02 | 显示全部楼层 |阅读模式

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

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

x
  1. >>> class Myproperty:
  2.         def __init__(self,fget=None,fset=None,fdel=None):
  3.                 self.fget=fget
  4.                 self.fset=fset
  5.                 self.fdel=fdel
  6.         def __get__(self,instance,owner):
  7.                 return self.fget(instance)
  8.         def __set__(self,instance,value):
  9.                 self.fset(instance,value)
  10.         def __del__(self,instance):
  11.                 self.fdel(instance)

  12.                
  13. >>> class C:
  14.         def __init__(self):
  15.                 self._x=None
  16.         def getX(self):
  17.                 return self._x
  18.         def setX(self,value):
  19.                 self._x=value
  20.         def delX(self):
  21.                 del self._x
  22.         x=Myproperty(getX,setX,delX)
复制代码


求大神解释下self.fset(instance,value)和self.fdel(instance)的意思
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-27 19:01:51 | 显示全部楼层
  1. >>> c=C()
  2. >>> c.x
  3. >>>
  4. >>> c.x='X=man'
  5. >>> c.x
  6. 'X=man'
  7. >>> c._x
  8. 'X=man'
  9. >>>
复制代码

还有运行中c._x是什么意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 20:11:45 | 显示全部楼层
云飘飘 发表于 2016-7-27 19:01
还有运行中c._x是什么意思

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

--------
这个是错的
del 改为 delete
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 20:14:23 | 显示全部楼层
  1. class 属性类:
  2.     def __init__(自身, 取=None, 赋=None, 删=None):
  3.         自身.取=取
  4.         自身.赋=赋
  5.         自身.删=删
  6.     def __get__(自身,触发者,所有者):
  7.         return 自身.取(触发者)
  8.     def __set__(自身,触发者,值):
  9.         自身.赋(触发者,值)
  10.     def __delete__(自身,触发者):
  11.         自身.删(触发者)

  12.             
  13. class C:
  14.     def __init__(自身):
  15.         自身._x=None
  16.     def 取(自身):
  17.         return 自身._x
  18.     def 赋(自身,值):
  19.         自身._x=值
  20.     def 删(自身):
  21.         del 自身._x
  22.     x = 属性类(取,赋,删)

  23. if __name__ == '__main__':
  24.     c = C()
  25.     print(c.x)
  26.     c.x='X=man'
  27.     print(c.x)
  28.     print(c._x)
  29.     del c.x
复制代码

用中文重写一遍,是不是容易理解些呢?


评分

参与人数 1荣誉 +6 鱼币 +6 贡献 +6 收起 理由
wei_Y + 6 + 6 + 6 SixSixSix~.

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 20:33:02 | 显示全部楼层
SixPy 发表于 2016-7-27 20:14
用中文重写一遍,是不是容易理解些呢?


已经知道如何运行了的,self是class Myproperty,instance是classC,  owner是小c,
但是还是不知道c.x和c._x有啥区别
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 20:50:14 | 显示全部楼层
云飘飘 发表于 2016-7-27 20:33
已经知道如何运行了的,self是class Myproperty,instance是classC,  owner是小c,
但是还是不知道c.x和c. ...

你的理解不够~

你最好用 debug 单步跟几遍~ 注意观察变量的值!!

点击图片看搞清无码大图
cls-prop.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-3 18:16:38 | 显示全部楼层
SixPy 发表于 2016-7-27 20:14
用中文重写一遍,是不是容易理解些呢?


版主你好我问一下问题关于property的实现原理:其中self.fget(instance),这个怎么理解,fget是函数?方法?为什么在类中无定义,求版主解答,查了半天了,一无所获
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-3 19:46:23 | 显示全部楼层
xue420361026 发表于 2017-6-3 18:16
版主你好我问一下问题关于property的实现原理:其中self.fget(instance),这个怎么理解,fget是函数?方法 ...

上面不是有中文的程序嘛~
认真看

结合debug功能,单步跟踪运行过程,开动脑筋思考。
只能帮你到这了~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-3 22:38:06 | 显示全部楼层
本帖最后由 xue420361026 于 2017-6-3 22:46 编辑
SixPy 发表于 2017-6-3 19:46
上面不是有中文的程序嘛~
认真看


谢谢,原来还有Debug control这样的神器。。。我想说下我的理解,您帮我判断一下对吗?
x=Myproperty(getX,setX,delX),使得者C的三个方法与Myproperty的(fget,fset,fdel)相对应。又因为self.fget=fget。
使得调用self.fget(instance)时,self.fget调用fget又传递到getX,instance相当于C类实例做getX方法的self。这样使得运行self.fget(instance)等价于运行getX()函数(方法)。
希望您有时间看一下,麻烦你了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-21 23:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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