将类描述符与get和s一起使用时,超出了最大递归深度

2024-09-27 07:33:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在玩弄我的代码,最后得到的结果是:

class TestProperty:
    def __init__(self,func):
         self.func = func
    def __set__(self,instance,value):
        setattr(instance,self.func.__name__,value)
    def __get__(self,instance,cls):
        if instance is None:
            return self
        else:
            return getattr(instance,self.func.__name__)


class John(object):
    def __init__(self):
        pass

    @TestProperty
    def TestProp(self):
       print('This line won\'t be printed')

p = John()
p.TestProp = 99
print(p.TestProp)

我试图理解创建类描述符并将其用于方法而不是属性时的行为。我很难理解到底发生了什么,如果有人能给我一些启示,这将是一个非常好的结果是递归错误?在

我最初的猜测是这样的:

  1. 调用用描述符修饰的方法
  2. 调用__set__或{},这取决于我们如何访问它。在
  3. 描述符试图设置调用实例的值,该实例最终将其映射回步骤1(错误)。在

有谁能详细地向我解释一下这是怎么发生的,我怎么解决的?在

除了理解类之外,提供的行为没有其他用途。在


Tags: instancenameselfreturninitvaluedefjohn
1条回答
网友
1楼 · 发布于 2024-09-27 07:33:30

不要使用getattr()setattr();您在那里再次触发描述符!描述符处理对TestProp名称的所有访问,使用setattr()和{}只是通过与p.TestProp相同的路径。在

直接在instance.__dict__中设置属性值:

def __get__(self,instance,cls):
    if instance is None:
        return self
    try:
        return instance.__dict__[self.func.__name__]
    except KeyError:
        raise AttributeError(self.func.__name__)
def __set__(self,instance,value):
    instance.__dict__[self.func.__name__] = value

这是因为您有一个数据描述符;数据描述符优先于实例属性。对p.TestProp的访问继续使用类上的描述符对象,即使名称'TestProp'存在于实例__dict__中。在

相关问题 更多 >

    热门问题