对于上下文,我将使用提示此问题的示例,即Scikit-Bio的DNA序列类。
基类是一个通用的python序列类。序列类从该类继承特定核酸(DNA,RNA ......)的序列。最后,有一个继承自Sequence的DNA类,它强制执行特定的DNA字母表。
因此以下代码列出了DNA对象的所有属性。
from skbio import DNA
d = DNA('ACTGACTG')
for attr in dir(d):
# All the attributes of d.
如何找到每个属性属于哪个父类?我之所以对此感兴趣,是因为我正在查看源代码,并希望能够知道哪个文件可以找到我想要查看的每个方法。
我能想到的最好的是:
for attr in dir(d)
print type(attr)
但这只返回所有字符串类型(我猜dir()返回一个字符串列表)。
如何在python中实现这一目标?有没有一个固有的理由不去尝试这个?或者这是OOP经常出现的问题吗?
答案 0 :(得分:1)
属性通常属于任何类。属性通常属于它们是属性的对象。
然而,方法与定义它们的类密切相关。
考虑这个程序:
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)
如您所见,每个属性a
,b
,c
和d
都与绑定到o
的对象相关联。在任何技术意义上,它们都不涉及任何特定的类别。
然而,方法create_attrib_a
和create_attrib_b
恰好包含了您想要的信息。了解inspect
模块如何检索其定义的文件名和行号。