我如何在源代码中找到函数的起源?

时间:2015-10-28 04:15:22

标签: python

我在实际关注源代码时遇到了麻烦,主要是因为简单地使用grep就没有了。

有没有办法找出某个方法继承自哪个类?例如,如果有类A,其中包含方法foo()bar(),则类B具有biz()和类{{1它继承了CA中的所有属性和方法,我怎样才能确定哪个类B来自哪个(没有严格查看手动来源)?

2 个答案:

答案 0 :(得分:0)

您可以通过查看该类的 __bases__ 属性来访问类的超类。给定三个简单类ABCPy2.7 必须 从{{1}继承}):

object

然后,您可以遍历class A: def foo(): pass def bar(): pass class B: def biz(): pass class C(A, B): pass __bases__ ,并检查其中一个类中是否存在属性C(例如) 。

要执行此操作,您可以在 __dict__ 中检查foo的成员资格,其中包含foo中每个类对象的名称:

__bases__

打印哪些:

for base in C.__bases__: 
    if 'foo' in base.__dict__: 
        print("Attribute: '{}' defined in {}".format("foo", base))

有关更完整和一般的观点:

Attribute: 'foo' defined in <class '__main__.A'>

返回:

# get all attributes of class C
vars = [classVar for classVar in dir(C) if not classVar.startswith('__')]

# iterate through all bases:
for base in C.__bases__: 
    for attr in vars:
        if attr in base.__dict__:
            print("Attribute: '{}' defined in {}".format(attr, base))

对于继承链中的所有类,您可以将Attribute: 'bar' defined in <class '__main__.A'> Attribute: 'foo' defined in <class '__main__.A'> Attribute: 'biz' defined in <class '__main__.B'> 切换为__mro__,表示方法解析顺序;尝试解析属性引用时,对象python搜索元组。

如果我们向类__bases__添加一个函数,并创建另一个继承自C的类D

C

要查看每个函数的定义位置,只需在循环中使用class C(A, B): def another(): pass class D(C): pass 切换__bases__

__mro__

现在,这遵循# hold D's attributes (functions names, variables.) attrs = [var for var in dir(D) if not var.startswith('__')] # vars contents: ['another', 'bar', 'biz', 'foo'] for base in D.__mro__: for attr in attrs: if attr in base.__dict__: print("Attribute: '{}' defined in {}".format(attr, base)) 元组(在此特定情况下等于mro)并产生类似的输出:

(__main__.D, __main__.C, __main__.A, __main__.B, object)

答案 1 :(得分:0)

您可以检查方法解析顺序确定的父类,并检查每个父类的成员:

for i in C.__mro__:
  if 'bar' in i.__dict__:
    print 'bar is in class ' + i.__name__

因此,给定以下类定义:

class A(object):
  def foo(self): pass
  def bar(self): pass

class B(object):
  def biz(self): pass

class C(A,B): pass

运行上面的代码将给出

bar is in class A