对象.__ 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__
尚不存在。