【发布时间】:2020-12-30 11:59:29
【问题描述】:
我试图永远调试我的代码,结果发现这是我的错误的原因,所以很难找到。一个简单的例子来说明我在说什么:
class Test():
def __init__(self):
self.a = 0
x = Test()
x.b = 2
print(x.a)
print(x.b)
此代码不会引发任何错误。事实上,它会成功打印出 0 和 2。所以即使 Test 不包含实例变量b,它仍然会在我分配它时创建它。如果我初始化第二个测试变量
y = Test()
print(y.b)
它会按预期抛出错误。
那么为什么首先存在这个功能,以便能够在类的实例上创建新属性?启用此行为的幕后发生了什么?有什么方法可以禁用这种行为,或者至少在编程时以某种方式捕获它?
【问题讨论】:
-
__dict__是您要查找的搜索词 -
有趣。所以看起来阻止它的唯一方法是覆盖自定义类的 setattr 。最初启用此功能背后的思考过程是什么?我觉得这样做弊大于利。
-
不是这样。
__slots__就是为此目的而制作的。如果你有__dict__,我总是可以通过x.__dict__['blah'] = 'haha!'绕过你的setattr
标签: python python-class