【发布时间】:2019-10-05 10:53:46
【问题描述】:
有没有办法检查对象是否具有不依赖于__getattr__ 或对象实现细节的属性?
考虑下面的代码。我希望 Proxy 将它无法处理的事情委托给 Wrapped。该代码有效,但我想避免测试attr in self.__dict__(我更喜欢稳定的接口来执行此操作,而不使用实现怪癖)。函数hasattr 在这里没有帮助,因为它通过__getattr__ 路由到包装对象。
class Wrapped:
def __init__(self):
self.a = 0
self.b = 1
class Proxy:
def __init__(self, wrapped):
object.__setattr__(self, 'wrapped', wrapped)
object.__setattr__(self, 'a', 2)
def __getattr__(self, attr):
return getattr(self.wrapped, attr)
def __setattr__(self, attr, value):
if attr in self.__dict__: # <-- Don't like this, hasattr doesn't work
object.__setattr__(self, attr, value)
elif hasattr(self.wrapped, attr):
setattr(self.wrapped, attr, value)
else: object.__setattr__(self, attr, value)
试驾:
>>> w = Wrapped()
>>> p = Proxy(w)
>>> p.a
2
>>> p.b
1
>>> p.a = 3
>>> p.a
3
>>> w.a
0
>>> p.b = 4
>>> p.b
4
>>> w.b
4
>>> p.c = 5
>>> p.c
5
>>> w.c
AttributeError: 'Wrapped' object has no attribute 'c'
【问题讨论】:
标签: python