我有一个类的属性,我可以在检查其他属性后更改这些属性,所以我编写了这个类:
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
