对象.__ setattr __()和直接设置是否有区别?

问题描述:

在WERKZEUG,我们看到:对象.__ setattr __()和直接设置是否有区别?

class Local(object): 
    __slots__ = ('__storage__', '__ident_func__') 

    def __init__(self): 
     object.__setattr__(self, '__storage__', {}) 

所以,我可以用self.__storage__ = {}更换object.__setattr__(self, '__storage__', {}),为什么?

相同的类定义了一个定制__setattr__方法,其存储值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__尚不存在。