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

问题描述 投票:1回答:1

在工具中,我们看到:

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

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

所以,我可以使用self.__storage__ = {}来取代object.__setattr__(self, '__storage__', {}),为什么?

python flask werkzeug
1个回答
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__属性。

© www.soinside.com 2019 - 2024. All rights reserved.