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

Mik*_*kay 1 python inheritance python-3.x

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
Run Code Online (Sandbox Code Playgroud)

现在collect_foo(D)返回[1, 1, 2, 3]- 1加倍- D从中派生出来A.问题是 - 如何获得独特foo的.我想到的第一件事是检查属性是否在给定的类中派生或声明 - 是否可能?怎么做?

Sve*_*ach 8

检查一下

'foo' in c.__dict__
Run Code Online (Sandbox Code Playgroud)

代替

hasattr(c, 'foo')
Run Code Online (Sandbox Code Playgroud)

只有Truec自身定义属性时才会产生这种情况.

  • 请注意,如果该类具有 __slots__,则会失败,因此请检查两者。 (2认同)

dap*_*wit 7

我相信这会起作用......看看它是否__dict__属于班级的属性.但是,请确保你真的想先这样做.

例:

if name in cls.__dict__:
    # ... your code here ...
    pass
Run Code Online (Sandbox Code Playgroud)

  • @Mikoskay:我实际上没有看到我的答案有任何显着差异. (3认同)