是否有一种方法可以检查对象是否具有不依赖于__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)
Testdrive:
>>> 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'
内置hasattr()
功能
通过调用
hasattr()
并查看其是否引发getattr(object, name)
来实现。
AttributeError
模块具有inspect方法,可用于
无需通过描述符协议
getattr_static()
或getattr_static()
即可获取属性,而无需触发动态查找。
使用此方法,您可以定义与__getattr__()
类似的__getattribute__()
方法,但是调用hasattr_static()
而不是hasattr()
:
inspect.getattr_static(object, name)
然后在getattr(object, name)
类的import inspect
def hasattr_static(object, name):
try:
inspect.getattr_static(object, name)
return True
except AttributeError:
return False
方法中使用它作为检查:
__setattr__()
或者,您可以使用Proxy
函数而不是def __setattr__(self, attr, value):
if hasattr_static(self, attr):
object.__setattr__(self, attr, value)
elif hasattr(self.wrapped, attr):
setattr(self.wrapped, attr, value)
else:
object.__setattr__(self, attr, value)
来检索对象的属性列表,或使用dir()
。
使用异常功能来帮助
dir()
其中className和classAttr作为字符串
为了执行我们不知道属性是否存在的命令
__dict__