Skip to main content
 首页 » 编程设计

python之getattr 的最大递归深度错误

2025年05月04日10langtianya

我有这个代码;

class NumberDescriptor(object): 
    def __get__(self, instance, owner): 
        name = (hasattr(self, "name") and self.name) 
        if not name: 
            name = [attr for attr in dir(owner) if getattr(owner,attr) is self][0] 
            self.name = name 
        return getattr(instance, '_' + name) 
    def __set__(self,instance, value): 
        name = (hasattr(self, "name") and self.name) 
        if not name: 
            owner = type(instance) 
            name = [attr for attr in dir(owner) if getattr(owner,attr) is self][0] 
            self.name = name 
        setattr(instance, '_' + name, int(value)) 
 
class Insan(object): 
    yas = NumberDescriptor() 
 
a = Insan() 
print a.yas 
a.yas = "osman" 
print a.yas 

我在行 name = [attr for attr in dir(owner) if getattr(owner,attr) is self][0] 中遇到最大递归深度错误。我希望该行获取用于当前描述符实例的变量名称。谁能看出我在这里做错了什么?

请您参考如下方法:

getattr() 调用正在调用您的 __get__。

解决此问题的一种方法是显式调用父类(super class) object:

object.__getattribute__(instance, name) 

或者,更清楚:

instance.__dict__[name]