object .__ setattr __()和直接设置之间有什么区别吗?

时间:2017-02-25 14:06:19

标签: python flask werkzeug

在werkzeug,我们看到:

printf()

那么,我可以使用class Local(object): __slots__ = ('__storage__', '__ident_func__') def __init__(self): object.__setattr__(self, '__storage__', {}) 替换self.__storage__ = {},为什么?

1 个答案:

答案 0 :(得分:2)

同一个类定义了一个custom __setattr__ method,用于将值存储在 self.__storage__中:

def __setattr__(self, name, value):
    ident = self.__ident_func__()
    storage = self.__storage__
    try:
        storage[ident][name] = value
    except KeyError:
        storage[ident] = {name: value}

但是,您首先需要设置初始空字典,因此object.__setattr__方法用于绕过自定义字典。

如果您使用self.__storage__ = {},则会调用上述自定义方法,这会导致属性错误,因为self.__storage__尚不存在。或者更确切地说,它会导致无限递归问题,因为custom __getattr__ method会被反复调用以解决丢失的__storage__属性。