【问题标题】:python how to find which parent classes define methods of a child objectpython如何查找哪些父类定义了子对象的方法
【发布时间】:2015-12-29 23:43:46
【问题描述】:

对于上下文,我将使用提示此问题的示例,即 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 中经常出现?

【问题讨论】:

  • 类的__mro__ 属性是其基的元组,在m方法r解决方案o中rder,如果那是你所追求的。您可以按如下方式找到一个类的文件:stackoverflow.com/a/697395/3001761
  • 一旦你有一份你感兴趣的事情的清单,你可能会更好地使用 grep。
  • @KamilSokołowski 不完全是,这就是一旦你拥有类本身后如何获取文件
  • 对于您的最终代码片段,请尝试for attr in dir(d): print type(getattr(d, attr))

标签: python


【解决方案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)

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

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

【讨论】:

  • 很有趣,所以没有办法找出刚刚给定对象中定义了哪个类“create_attrib_a”?
  • 没有(实用的)方法可以找到定义了哪个类的代码a。有多种方法可以找到定义create_attrib_a 的类。方法(如create_attrib_a 比属性(如a)拥有更多可用数据。您是说您对方法感兴趣?
  • @Malonge ,请参阅我最近的编辑以了解如何查找方法的源代码。
  • 感谢您帮助我解决这个问题!
猜你喜欢
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 2016-04-13
  • 2010-09-16
  • 2021-06-21
  • 2011-04-25
相关资源
最近更新 更多