以下是 werkzeug
库中 Local
类的 __init__
方法:
def __init__(self):
object.__setattr__(self, '__storage__', {})
object.__setattr__(self, '__ident_func__', get_ident)
这段代码有两点我不明白:
他们为什么写
object.__setattr__(self, '__storage__', {})
而不是简单地
`setattr(self, '__storage__', {})`
如果可以简单地写,他们为什么还要使用
__setattr__
self.__storage__ = {}
最佳答案
这确保使用 __setattr__
的默认 Python 定义。如果类重写了 __setattr__
以执行非标准行为,但您仍然希望访问原始的 __setattr__
行为,则通常使用它。
对于 werkzeug,如果您查看 Local
类,您会看到 __setattr__
定义如下:
def __setattr__(self, name, value):
ident = self.__ident_func__()
storage = self.__storage__
try:
storage[ident][name] = value
except KeyError:
storage[ident] = {name: value}
它不是在对象的字典中设置属性,而是将它们设置在先前初始化的 __storage__
字典中。为了完全设置 __storage__
属性(以便以后可以像 self.__storage__
一样访问它),__setattr__
的原始定义来自必须使用对象,这就是为什么在构造函数中使用笨拙的符号。
关于python - `object.__setattr__(self, ..., ...)` 而不是 `setattr(self, ..., ...)` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33041518/