class Local(object):
__slots__ = ('__storage__', '__ident_func__')
def __init__(self):
object.__setattr__(self, '__storage__', {})
object.__setattr__(self, '__ident_func__', get_ident)
def __call__(self, proxy):
"""Create a proxy for a name."""
return LocalProxy(self, proxy)
def __getattr__(self, name):
try:
return self.__storage__[self.__ident_func__()][name]
except KeyError:
raise AttributeError(name)
def __setattr__(self, name, value):
ident = self.__ident_func__()
storage = self.__storage__
try:
storage[ident][name] = value
except KeyError:
storage[ident] = {name: value}
def __delattr__(self, name):
try:
del self.__storage__[self.__ident_func__()][name]
except KeyError:
raise AttributeError(name)
我想知道__setattr__
魔术函数和self.__xxx__ = {}
之间的区别。
现在,我在这里放了更多代码。在构造函数中,它是对象。 setattr 。那么改写对它有影响吗?
答案 0 :(得分:0)
与几乎所有__...__
类一样,__setattr__
基本上被设计为在继承类中被重写以更改Python类的工作方式。如果不需要更改x.foo
的语义,则可能不存在__setattr__
。 x.foo
被定义为__setattr__
。因此它可以执行任何操作(例如,在Django中设置数据库字段)。
但是请注意,问题中的代码调用object.__setattr__
,而不是self
上的代码。因此,即使当前类重写__setattr__
来做完全不同的事情,您仍然可以使用object
的原始属性设置行为的定义来...设置属性。