此Python代码中__setattr__的含义是什么?

时间:2018-07-09 03:34:41

标签: python

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 。那么改写对它有影响吗?

1 个答案:

答案 0 :(得分:0)

与几乎所有__...__类一样,__setattr__基本上被设计为在继承类中被重写以更改Python类的工作方式。如果不需要更改x.foo的语义,则可能不存在__setattr__x.foo被定义为__setattr__。因此它可以执行任何操作(例如,在Django中设置数据库字段)。

但是请注意,问题中的代码调用object.__setattr__,而不是self上的代码。因此,即使当前类重写__setattr__来做完全不同的事情,您仍然可以使用object的原始属性设置行为的定义来...设置属性。

相关问题