python如何查找哪些父类定义子对象的方法

python how to find which parent classes define methods of a child object

对于上下文,我将使用提示这个问题的示例,即Scikit Bio的DNA序列类。

基类是一个通用的Python序列类。一个序列类从该类继承特定的核酸(DNA,RNA…)序列。最后,还有一个dna类,它继承了执行dna特定字母表的序列。

所以下面的代码列出了DNA对象的所有属性。

1
2
3
4
5
from skbio import DNA

d = DNA('ACTGACTG')
for attr in dir(d):
    # All the attributes of d.

如何找到每个属性所属的父类?我之所以对此感兴趣,是因为我正在浏览源代码,我想知道我可以找到每个我想查看的方法的文件。

我能想到的最好的办法就是这样:

1
2
for attr in dir(d)
    print type(attr)

但这只返回所有字符串类型(我猜dir()返回字符串列表)。

如何在Python中实现这一点?有没有一个固有的理由不去尝试这个?或者这是经常出现在OOP中的事情?


属性通常不属于任何类。属性通常属于其作为属性的对象。

然而,方法与定义它们的类密切相关。

考虑这个程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class base(object):
    def create_attrib_a(self):
        self.a = 1
class derived(base):
    def create_attrib_b(self):
        self.b = 1
def create_attrib_c(obj):
   obj.c = 1

import inspect

o = derived()
o.create_attrib_a()
o.create_attrib_b()
create_attrib_c(o)
o.d = 1

# The objects attributes are relatively anonymous
print o.__dict__

# But the class's methods have lots of information available
for name, value in inspect.getmembers(o, inspect.ismethod):
    print 'Method=%s, filename=%s, line number=%d'%(
        name,
        value.im_func.func_code.co_filename,
        value.im_func.func_code.co_firstlineno)

如您所见,每个属性abcd都与绑定到o的对象相关联。在任何技术意义上,它们都不与任何特定的类相关。

但是,方法create_attrib_acreate_attrib_b精确地携带了您想要的信息。查看inspect模块如何检索其定义的文件名和行号。