Python 如何设置特定于我的代理的一些属性,以防止原始对象获取它

Python 如何设置特定于我的代理的一些属性,以防止原始对象获取它,python,Python,我想设置一些特定于我的代理的属性,或者将属性同时传递给代理和原始,所以我尝试了以下代码。我不明白为什么:“setattr(self,name,value)”会因为递归错误而失败 class Proxy: def __init__(self, obj): self._obj = obj # Delegate attribute lookup to internal obj def __getattr__(self, name): retur

我想设置一些特定于我的代理的属性,或者将属性同时传递给代理和原始,所以我尝试了以下代码。我不明白为什么:“setattr(self,name,value)”会因为递归错误而失败

class Proxy:
    def __init__(self, obj):
        self._obj = obj

    # Delegate attribute lookup to internal obj
    def __getattr__(self, name):
        return getattr(self._obj, name)

    # Delegate attribute assignment
    def __setattr__(self, name, value):
        if name.startswith('_'):
            setattr(self,name, value)    # Call original __setattr__
        else:
            setattr(self._obj, name, value)

if __name__ == '__main__':
    class A:
        def __init__(self, x):
            self.x = x
        def spam(self):
            print('A.spam')

    a = A(42)
    p = Proxy(a)
    print(p.x)
    print(p.spam())
    p.x = 37
    print('Should be 37:', p.x)
    print('Should be 37:', a.x)
    p._y=3
    print('p._y',p._y)
    try:
        print('a._y',a._y)
    except Exception as e:
        print(e)


我不明白为什么:“setattr(self,name,value)”会因为递归错误而失败

class Proxy:
    def __init__(self, obj):
        self._obj = obj

    # Delegate attribute lookup to internal obj
    def __getattr__(self, name):
        return getattr(self._obj, name)

    # Delegate attribute assignment
    def __setattr__(self, name, value):
        if name.startswith('_'):
            setattr(self,name, value)    # Call original __setattr__
        else:
            setattr(self._obj, name, value)

if __name__ == '__main__':
    class A:
        def __init__(self, x):
            self.x = x
        def spam(self):
            print('A.spam')

    a = A(42)
    p = Proxy(a)
    print(p.x)
    print(p.spam())
    p.x = 37
    print('Should be 37:', p.x)
    print('Should be 37:', a.x)
    p._y=3
    print('p._y',p._y)
    try:
        print('a._y',a._y)
    except Exception as e:
        print(e)


因为
setattr
调用
\uuuu setattr\uuuu
魔术方法:

如果
\uuuuu setattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

这样做:

…
    def __setattr__(self, name, value):
        if name.startswith('_'):
            object.setattr(self, name, value)    # Call original __setattr__
        else:
            object.setattr(self._obj, name, value)
…