Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python如何找到定义子对象方法的父类_Python - Fatal编程技术网

python如何找到定义子对象方法的父类

python如何找到定义子对象方法的父类,python,Python,在上下文中,我将使用引发这个问题的示例,即Scikit Bio的DNA序列类 基类是一个通用的python序列类。序列类从该类继承特定于核酸(DNA、RNA…)的序列。最后,还有一个DNA类,它继承了执行DNA特定字母表的序列 下面的代码列出了DNA对象的所有属性 from skbio import DNA d = DNA('ACTGACTG') for attr in dir(d): # All the attributes of d. 如何找到每个属性所属的父类?我之所以对此感兴

在上下文中,我将使用引发这个问题的示例,即Scikit Bio的DNA序列类

基类是一个通用的python序列类。序列类从该类继承特定于核酸(DNA、RNA…)的序列。最后,还有一个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中经常出现的问题

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

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

考虑一下这个计划:

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
精确地携带了您想要的信息。查看模块如何检索其定义的文件名和行号。

类的
\uuuu mro\uuuu
属性是其基的元组,按方法解析顺序排列,如果您想要的是这样的话。你可以按如下方式找到一个类的文件:一旦你有了你感兴趣的东西的列表,你可能最好使用grepping。可能的重复:@KamilSokołowski不完全一样,这就是在你有了类之后获取文件的方法。对于你的最终代码片段,在dir(d):print type(getattr(d,attr))中为attr尝试
。有趣的是,没有办法找出在给定的对象中定义了哪个类“create\u attrib\u a”?没有(实用的)办法找到哪个类的代码定义了
a
。有几种方法可以找到定义了
创建属性a
的类。方法(如
create\u attrib\u a
比属性(如
a
)有更多可用数据。你是说你对这些方法感兴趣吗?@Malonge,有关如何查找方法的源代码,请参阅我最近的编辑。谢谢你的帮助!