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

Avi*_*ohn 5 python methods class

以下是来自库__init__Local类的方法werkzeug:

def __init__(self):
    object.__setattr__(self, '__storage__', {})
    object.__setattr__(self, '__ident_func__', get_ident)
Run Code Online (Sandbox Code Playgroud)

我不明白这个代码的两件事:

  1. 他们为什么写

    object.__setattr__(self, '__storage__', {})
    
    Run Code Online (Sandbox Code Playgroud)

    而不是简单的

    `setattr(self, '__storage__', {})`
    
    Run Code Online (Sandbox Code Playgroud)
  2. __setattr__如果可以简单地写,他们为什么甚至使用它们

    self.__storage__ = {}
    
    Run Code Online (Sandbox Code Playgroud)

Sim*_*ead 6

这可确保使用默认的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}
Run Code Online (Sandbox Code Playgroud)

它不是在对象的字典中设置属性,而是将它们设置在__storage__先前初始化的字典中.为了完全设置__storage__属性(以便可以像self.__storage__以后一样访问它),__setattr__必须使用from对象的原始定义,这就是构造函数中使用笨拙符号的原因.