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)
我不明白这个代码的两件事:
他们为什么写
object.__setattr__(self, '__storage__', {})
Run Code Online (Sandbox Code Playgroud)
而不是简单的
`setattr(self, '__storage__', {})`
Run Code Online (Sandbox Code Playgroud)__setattr__如果可以简单地写,他们为什么甚至使用它们
self.__storage__ = {}
Run Code Online (Sandbox Code Playgroud)这可确保使用默认的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对象的原始定义,这就是构造函数中使用笨拙符号的原因.