加速星球 发表于 2023-8-30 10:19:29

描述符传入instance参数的问题


问题如图,求大佬解答{:5_92:}

不二如是 发表于 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 方法,可以在方法内部访问实例对象的状态,并根据需要返回相应的值。

加速星球 发表于 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?实际作用就是确定哪个实例对象的作用吗

九歌当下 发表于 2023-8-30 15:48:04

instance 表示属性所属的实例对象,self.fget(instance) 相当于调用了 c.getx() 方法,传入instance是为了确定是哪个实例对象的getx,{:10_279:}

九歌当下 发表于 2023-8-30 15:49:49

这只是一个参数名,不要和isinstance() 函数搞混了

小甲鱼 发表于 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 的值。

……

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

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

{:10_323:}

加速星球 发表于 2023-9-20 10:44:58

小甲鱼 发表于 2023-8-30 23:01
我帮你捋一下哈:

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

{:5_92:}谢谢老师今天才看到已经看到模块了
页: [1]
查看完整版本: 描述符传入instance参数的问题