检查类属性是否在给定类中定义或派生

10 投票
4 回答
7235 浏览
提问于 2025-04-16 13:23

示例

class A:
    foo = 1

class B:
    foo = 2

class C:
    foo = 3

class D(A, B, C):
    pass

def collect_foo(cls):
    import inspect
    foos = []
    for c in inspect.getmro(cls):
        if hasattr(c, 'foo'):
            foos.append(c.foo)
    return foos

现在,collect_foo(D) 返回的是 [1, 1, 2, 3] - 这里的 1 出现了两次,因为 D 是从 A 继承过来的。问题是 - 如何得到唯一的 foo 值。首先我想到的是检查某个属性是从哪个类继承的,还是在当前类中声明的 - 这样做可以吗?怎么实现呢?

4 个回答

1

“问题是,有些属性我不想被覆盖,而是希望它们能够混合在一起,并且可以在派生类中使用。”

这正是Python中的命名空间混淆所做的事情。那些不应该被覆盖的属性应该以两个下划线开头。这样,它们就不会被覆盖,同时每个类都有自己独特的属性。

17

只需检查一下

'foo' in c.__dict__

而不是

hasattr(c, 'foo')

这样做只有在属性在 c 本身被定义的情况下,才会返回 True

11

我觉得这样做应该没问题……可以看看这个类的 __dict__ 属性里有没有。 但是,首先要确保你真的想这么做。

举个例子:

if name in cls.__dict__:
    # ... your code here ...
    pass

撰写回答