Python 如何设置特定于我的代理的一些属性,以防止原始对象获取它
我想设置一些特定于我的代理的属性,或者将属性同时传递给代理和原始,所以我尝试了以下代码。我不明白为什么:“setattr(self,name,value)”会因为递归错误而失败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
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)
…