如何列出已导入类的所有方法/类。举个例子
from module1 import method1
from module2 import method2
class foo(object):
def say_foo(self):
method1()
def talk(self):
method2()
是否可以列出foo
类中使用的所有方法?我知道inspect.getmembers(foo)
会列出talk
和say_foo
,如何列出method1
和method2
?
答案 0 :(得分:3)
说实话,你的问题并没有多大意义,这就是为什么:
在定义foo
时,say_foo
和talk
调用的两个全局变量与代码顶部导入的两个函数之间没有连接。
例如,口译员不会抱怨以下内容:
class foo(object):
def say_foo(self):
method1()
def talk(self):
method2()
尽管没有导入,但这仍然是有效的代码。当然,如果没有say_foo
,您就无法致电talk
和NameError
。
以下情况也很好:
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)
什么? method1
和method2
尚未“导入”foo
课程。它们已在模块中导入,因此dir(foomodule)
将显示它们。但是从foo
到method1
根本就没有引用。