gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:25:07 24 4
gpt4 key购买 nike

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

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

关于python - 为什么我无法在对象的 __setattr__ 方法中获取属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57999648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com