|
发表于 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 的值。
……
为什么这么绕呢,因为它的设计就是这样,也只能这样才能通过第三方的类去管理另外一个类的实例化对象的属性。
慢慢捋一捋,其实也不是很难啦~
|
|