gpt4 book ai didi

python - `object.__setattr__(self, ..., ...)` 而不是 `setattr(self, ..., ...)` ?

转载 作者:太空狗 更新时间:2023-10-30 00:44:12 24 4
gpt4 key购买 nike

以下是 werkzeug 库中 Local 类的 __init__ 方法:

def __init__(self):
object.__setattr__(self, '__storage__', {})
object.__setattr__(self, '__ident_func__', get_ident)

这段代码有两点我不明白:

  1. 他们为什么写

    object.__setattr__(self, '__storage__', {})

    而不是简单地

    `setattr(self, '__storage__', {})`
  2. 如果可以简单地写,他们为什么还要使用 __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/

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