鱼C论坛

 找回密码
 立即注册
查看: 1809|回复: 6

[已解决]描述符传入instance参数的问题

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

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

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

x
L5C01{70}M10~WO)R22IJXR.png
问题如图,求大佬解答
最佳答案
2023-8-30 15:48:04
instance 表示属性所属的实例对象,self.fget(instance) 相当于调用了 c.getx() 方法,传入instance是为了确定是哪个实例对象的getx,

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2023-8-30 11:03:05 | 显示全部楼层
是的,self.fget 可以理解为 x.getx,即调用 c 的 getx 方法。在这里,instance 表示属性所属的实例对象,即 c。它作为参数传递给 self.fget 方法,用于在 getx 方法内部进行操作。

当 self.fget(instance) 执行时,实际上是调用了 c.getx() 方法,并将 c 作为参数传递给了 getx 方法。这样,getx 方法内部可以使用 instance(即 c)来访问和操作实例对象的其他属性或执行其他逻辑。

执行后的作用取决于 getx 方法内部的实现。通常情况下,getx 方法会返回属性 x 的值,可能经过一些计算、验证或其他操作。通过将 instance 作为参数传递给 getx 方法,可以在方法内部访问实例对象的状态,并根据需要返回相应的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-30 12:04:35 | 显示全部楼层
不二如是 发表于 2023-8-30 11:03
是的,self.fget 可以理解为 x.getx,即调用 c 的 getx 方法。在这里,instance 表示属性所属的实例对象, ...

‘’当 self.fget(instance) 执行时,实际上是调用了 c.getx() 方法,并将 c 作为参数传递给了 getx 方法‘’这个传入的instance是不是有有点类似于self的作用,用来确定是哪个实例对象的getx?实际作用就是确定哪个实例对象的作用吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-30 15:48:04 | 显示全部楼层    本楼为最佳答案   
instance 表示属性所属的实例对象,self.fget(instance) 相当于调用了 c.getx() 方法,传入instance是为了确定是哪个实例对象的getx,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-30 15:49:49 | 显示全部楼层
这只是一个参数名,不要和isinstance() 函数搞混了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-30 23:01:03 | 显示全部楼层
我帮你捋一下哈:

x = MyProperty(getx, setx, delx) # 这里将类 C 中的 getx,setx,delx 三个函数作为 MyProperty() 类的实例化参数传递。

那么在描述符类 MyProperty() 中,这三个参数分别给到了 self.fget,self.fset,self.fdel。

是这么一个传递方式。

那么描述符的作用是什么呢?

就是描述符所描述的类的实例化对象的属性被访问、赋值、删除的时候,分别会触发描述符类的 __get__()、__set__()、__delete__() 三个魔法方法。

而这些个魔法方法的 instance 就是描述符所描述的类的实例化对象(在例子中是 c)

比如 c.x 访问了描述符所描述的类的实例化对象的属性,对吧?

那么它就会处罚 __get__(self, instance, owner) 方法,这里面 self 是 MyProperty 的实例对象即 x, instance 是 c, owner 是 C,这点一定要记住。

那么调用了 __get__(),它是返回 self.fget(instance),还记得 self.fget() 是什么吗?

是类 C 的 getx() 方法嘛,instance 上面说了,是 c,所以这里 self.fget(c) 相当于 getx(c),相当于 return ._x,也就是返回类 C 里面的隐藏属性 _x 的值。

……

为什么这么绕呢,因为它的设计就是这样,也只能这样才能通过第三方的类去管理另外一个类的实例化对象的属性。

慢慢捋一捋,其实也不是很难啦~


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

使用道具 举报

 楼主| 发表于 2023-9-20 10:44:58 | 显示全部楼层
小甲鱼 发表于 2023-8-30 23:01
我帮你捋一下哈:

x = MyProperty(getx, setx, delx) # 这里将类 C 中的 getx,setx,delx 三个函数作为 ...

谢谢老师  今天才看到  已经看到模块了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 09:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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