Python如何列出已导入类的所有方法/类

时间:2011-08-03 13:31:27

标签: python function

如何列出已导入类的所有方法/类。举个例子

from module1 import method1
from module2 import method2

class foo(object):
   def say_foo(self):
      method1()
   def talk(self):
      method2()

是否可以列出foo类中使用的所有方法?我知道inspect.getmembers(foo)会列出talksay_foo,如何列出method1method2

3 个答案:

答案 0 :(得分:3)

说实话,你的问题并没有多大意义,这就是为什么:

在定义foo时,say_footalk调用的两个全局变量与代码顶部导入的两个函数之间没有连接。

例如,口译员不会抱怨以下内容:

class foo(object):
   def say_foo(self):
      method1()
   def talk(self):
      method2()

尽管没有导入,但这仍然是有效的代码。当然,如果没有say_foo,您就无法致电talkNameError

以下情况也很好:

from module1 import method1
from module2 import method2

class foo(object):
   def say_foo(self):
      method1()
   def talk(self):
      method2()

obj1 = foo()
obj1.say_foo()

def method1(): pass

obj1.say_foo()
obj2 = foo()
obj2.say_foo()

我留给你找出哪个method1被调用。

现在,说了这么多,你可以做什么。如果你检查方法对象的co_names,那就会给你list of names that are used by the method

In [30]: foo.say_foo.im_func.func_code.co_names
Out[30]: ('method1',)

In [31]: foo.talk.im_func.func_code.co_names
Out[31]: ('method2',)

这显然与您要求的内容不完全相同,根据您打算如何处理,可能会有用,也可能没用。

几乎可以肯定是CPython特有的。

答案 1 :(得分:2)

使用ast模块分析代码:

code = """
from module1 import method1
from module2 import method2

class foo(object):
   def say_foo(self):
      method1()
   def talk(self):
      method2()
"""

import ast, _ast

t = ast.parse(code)
for node in ast.walk(t):
    if isinstance(node, ast.ClassDef) and node.name == "foo":
        klass = node
        break

for node in ast.walk(klass):
    if isinstance(node, _ast.Call):
        print node.func.id

输出是:

method1
method2

答案 2 :(得分:1)

什么? method1method2尚未“导入”foo课程。它们已在模块中导入,因此dir(foomodule)将显示它们。但是从foomethod1根本就没有引用。