获取未继承的所有属性的列表

Awa*_*mar 6 python inheritance

如果我有一个父类和一个子类,我想要列出在子类中定义但不是从父类继承的所有属性。

注意:我知道我可以从父类获取所有属性的列表,并从子类获取所有属性并进行交集,但这在我的场景中不起作用。

Tom*_*dor 5

您可以利用这样一个事实:属性的地址与继承的地址不同(等于)。参见示例:

from __future__ import print_function

class A:
    def f(self):
        pass

    def g(self):
        pass


class B(A):
    def f(self):
        # overriden
        pass

    def h(self):
        pass

import inspect

a = dict(inspect.getmembers(A))
# print(a)
b = dict(inspect.getmembers(B))
# print(b)

for k, v in b.items():
    if k.startswith('__'):
        continue
    if k not in a or v != a[k]:
        print('Not inherited:', k, v)
Run Code Online (Sandbox Code Playgroud)

打印:

Not inherited: f <function B.f at 0x000002523A3E00D0>
Not inherited: h <function B.h at 0x000002523A3E0158>
Run Code Online (Sandbox Code Playgroud)

如果不使用该inspect模块,则可以使用简单的dir(), 代替。

你需要的不是交集,而是设定的差异。并且先过滤掉“魔法”属性。

编辑您可能还想获取“全新”的属性,即它们从未在基类中。你并不关心被覆盖的东西也是“新的”。你想要“全新”。

只需要对上面的代码稍作修改即可:

for k, v in b.items():
    if k.startswith('__'):
        continue
    if k not in a:  # HERE: no 'or v != a[k]'
        print('Added in b:', k, v)
Run Code Online (Sandbox Code Playgroud)

  • 这仍然返回继承的属性/方法 (2认同)