加速星球 发表于 2023-8-29 12:39:16

描述符问题


这个myproperty里面的返回的shelf.fget(instance)是不是等于是x.getx(c)?

isdkz 发表于 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)。

加速星球 发表于 2023-8-30 00:49:39

isdkz 发表于 2023-8-29 12:39
是的,myproperty中的返回值shelf.fget(instance)等同于x.getx(c)。

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

{:5_92:}谢谢大佬!那么它传入这个c是怎么用的?没看懂c=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() 的时候,举过这个例子:

>>> class C:
        def __init__(self):
                self._x = 250
        def getx(self):
                return self._x
        def setx(self, value):
                self._x = value
        def delx(self):
                del self._x
        x = property(getx, setx, delx)
       
>>> c = C()
>>> c.x
250
>>> c.x = 520
>>> c.__dict__
{'_x': 520}
>>> del c.x
>>> c.__dict__
{}
对比上方截图的例子,实现的效果是一致的,因为这就是 property() 函数的内部实现原理。


页: [1]
查看完整版本: 描述符问题