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

标签 python class methods

以下是 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/

相关文章:

c++ - 在另一个类中定义静态类指针

python - 在 Python 中间歇性地跳行

python - 计算落在一组 x、y、z 坐标之间的值的数量

Python 2.7 - 如何将类属性(指针?)分配给变量(需要创建 Oz 式数据流变量)

c# - 记录和计算时间的方法是什么?

Delphi - 有关记录中方法的 RTTI 信息

java - 方法/功能差异的澄清

python - pandas 方式将一天中的时间(有效 datetime.time)转换为浮点变量

python - TF超薄: Fine Tune mobilenet v2 on custom dataset

PHP 路径串联