描述符问题
这个myproperty里面的返回的shelf.fget(instance)是不是等于是x.getx(c)? 是的,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)。 isdkz 发表于 2023-8-29 12:39
是的,myproperty中的返回值shelf.fget(instance)等同于x.getx(c)。
myproperty是一个描述符,它定义了 ...
{:5_92:}谢谢大佬!那么它传入这个c是怎么用的?没看懂c=C()?这个的作用是什么? 加速星球 发表于 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]