检查对象是否具有属性,而不依赖于'__getattr __'

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

是否有一种方法可以检查对象是否具有不依赖于__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'
python
2个回答
0
投票

内置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()


-2
投票

使用异常功能来帮助

dir()

其中className和classAttr作为字符串

为了执行我们不知道属性是否存在的命令

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