Skip to main content
 首页 » 编程设计

python之为什么我无法在对象的 __setattr__ 方法中获取属性

2025年05月04日18myhome

我有一个类的属性,我可以在检查其他属性后更改这些属性,所以我编写了这个类:

class MyClass(): 
    def __init__(self, x): 
        self.x = x 
 
    def __setattr__(self, name, value): 
        print(self.x)  # doesn't work 
 
        self.__dict__[name] = value 
 
if __name__ == '__main__': 
    myObj = MyClass(1) 
 
    myObj.x = 2 

但是我得到了这个错误

AttributeError: 'MyClass' object has no attribute 'x' 

如果我没有 print(self.x) 属性被重写,但我需要检查其他属性以更改另一个属性。

我尝试了 self.__dict__[name] 和 getattr(self, name) 但我得到了同样的错误。

请您参考如下方法:

完整的错误信息是信息性的:

Traceback (most recent call last): 
  File "example_code.py", line 11, in <module> 
    myObj = MyClass(1) 
  File "example_code.py", line 3, in __init__ 
    self.x = x 
  File "example_code.py", line 6, in __setattr__ 
    print(self.x)  # doesn't work 
AttributeError: 'MyClass' object has no attribute 'x' 

您在 MyClass 的初始化中看到一个错误,它会依次调用 self.x = x,而后者又会调用您的自定义 __setattr__ 实现来完成这项工作。此时它正在尝试打印 x,但这是在 x 分配给类之前,因为您还没有完成这项工作。

有几种方法可以解决这个问题,最直接的可能是在您尝试访问它之前验证您的类是否确实具有该属性:

class MyClass(): 
    def __init__(self, x): 
        self.x = x 
 
    def __setattr__(self, name, value): 
        if hasattr(self, 'x'): 
            print(self.x)  # works now 
 
        self.__dict__[name] = value 
 
if __name__ == '__main__': 
    myObj = MyClass(1) 
 
    myObj.x = 2