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

2023-12-28

以下是__init__的方法Local类来自werkzeug图书馆:

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__ = {}
    

这确保了 Python 的默认定义__setattr__用来。如果类已重写,通常会使用它__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__必须使用 from object,这就是为什么在构造函数中使用尴尬的符号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

`object.__setattr__(self, ..., ...)` 而不是 `setattr(self, ..., ...)`? 的相关文章

随机推荐