Awa*_*mar 6 python inheritance
如果我有一个父类和一个子类,我想要列出在子类中定义但不是从父类继承的所有属性。
注意:我知道我可以从父类获取所有属性的列表,并从子类获取所有属性并进行交集,但这在我的场景中不起作用。
您可以利用这样一个事实:属性的地址与继承的地址不同(等于)。参见示例:
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)
| 归档时间: |
|
| 查看次数: |
890 次 |
| 最近记录: |