鱼C论坛

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

[已解决]描述符问题

[复制链接]
发表于 2023-8-29 12:39:16 | 显示全部楼层 |阅读模式

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

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

x
1693283814662.jpg
这个myproperty里面的返回的shelf.fget(instance)  是不是等于是x.getx(c)?
最佳答案
2023-8-30 15:59:17
加速星球 发表于 2023-8-30 00:49
谢谢大佬!那么它传入这个c是怎么用的?没看懂c=C()?这个的作用是什么?


MyProperty() 是我们自己定义的 property() 函数,这里我们通过描述符的方式来自己实现与 property() 函数相同的功能

描述符也就是干这个事儿的,可以说没有描述符,就没有 property() 函数。

C 是一个测试类(这里用于测试 MyProperty() 是否产生与 property() 相同的功能),c 则是 C 的实例化对象。

在讲 property() 的时候,举过这个例子:

  1. >>> class C:
  2.         def __init__(self):
  3.                 self._x = 250
  4.         def getx(self):
  5.                 return self._x
  6.         def setx(self, value):
  7.                 self._x = value
  8.         def delx(self):
  9.                 del self._x
  10.         x = property(getx, setx, delx)
  11.        
  12. >>> c = C()
  13. >>> c.x
  14. 250
  15. >>> c.x = 520
  16. >>> c.__dict__
  17. {'_x': 520}
  18. >>> del c.x
  19. >>> c.__dict__
  20. {}
复制代码

对比上方截图的例子,实现的效果是一致的,因为这就是 property() 函数的内部实现原理。


评分

参与人数 1荣誉 +4 贡献 +3 收起 理由
python爱好者. + 4 + 3 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-29 12:39:40 | 显示全部楼层
是的,myproperty中的返回值shelf.fget(instance)等同于x.getx(c)。

myproperty是一个描述符,它定义了三个方法:__get__、__set__和__delete__。当我们使用myproperty装饰一个类的属性时,它会将这个属性转变为一个描述符对象。

在这个问题中,我们假设myproperty装饰了一个名为x的属性。当我们使用instance.x访问这个属性时,实际上会调用myproperty的__get__方法。这个方法接收两个参数:self和instance。self是myproperty的实例对象,而instance是调用属性的实例对象。

在myproperty的__get__方法中,我们可以看到返回了shelf.fget(instance)。这里的shelf是myproperty的一个属性,它是一个函数对象。这个函数对象会在myproperty的构造函数中传入,并保存在self.fget中。

所以,返回值shelf.fget(instance)实际上是调用了self.fget(instance),也就是调用了x.getx(c)。这里的c是调用属性的实例对象。

综上所述,返回值shelf.fget(instance)等于x.getx(c)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-30 00:49:39 | 显示全部楼层
isdkz 发表于 2023-8-29 12:39
是的,myproperty中的返回值shelf.fget(instance)等同于x.getx(c)。

myproperty是一个描述符,它定义了 ...

谢谢大佬!那么它传入这个c是怎么用的?没看懂c=C()?这个的作用是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-30 15:59:17 | 显示全部楼层    本楼为最佳答案   
加速星球 发表于 2023-8-30 00:49
谢谢大佬!那么它传入这个c是怎么用的?没看懂c=C()?这个的作用是什么?


MyProperty() 是我们自己定义的 property() 函数,这里我们通过描述符的方式来自己实现与 property() 函数相同的功能

描述符也就是干这个事儿的,可以说没有描述符,就没有 property() 函数。

C 是一个测试类(这里用于测试 MyProperty() 是否产生与 property() 相同的功能),c 则是 C 的实例化对象。

在讲 property() 的时候,举过这个例子:

  1. >>> class C:
  2.         def __init__(self):
  3.                 self._x = 250
  4.         def getx(self):
  5.                 return self._x
  6.         def setx(self, value):
  7.                 self._x = value
  8.         def delx(self):
  9.                 del self._x
  10.         x = property(getx, setx, delx)
  11.        
  12. >>> c = C()
  13. >>> c.x
  14. 250
  15. >>> c.x = 520
  16. >>> c.__dict__
  17. {'_x': 520}
  18. >>> del c.x
  19. >>> c.__dict__
  20. {}
复制代码

对比上方截图的例子,实现的效果是一致的,因为这就是 property() 函数的内部实现原理。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 10:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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