2011-08-03 33 views
2

如何列出已導入到類中的所有方法/類。舉例Python如何列出已導入到類中的所有方法/類

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

+0

say_foo的'代碼()'將只包含對全局名稱的引用'method1',並且在執行'say_foo()'的過程中,該名稱將被解析爲該全局名稱在執行時指向的任何對象。這可能是一個完全不同於'method1'在定義'say_foo()'時指向的對象。 (而且,'from module1 import method1'中的命名沒有多大意義,Python中沒有模塊級別的「方法」。) –

+0

@Sven,我已經說過函數而不是方法了! – user739807

+0

是的,這就是它們在Python中的調用方式,但這個評論只是一個附註。我的主要觀點是,你想要做的事情沒有多大意義。 –

回答

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 
1

什麼? method1method2尚未被「導入」foo類。它們被導入到模塊中,所以dir(foomodule)會顯示它們。但從foomethod1根本沒有提及。

3

要敢說真話,你的問題不作一大堆的意識,這是爲什麼:

在點時foo定義兩個全局的say_foo調用者之間,沒有建立連接並talk並將兩個函數導入到代碼的頂部。

例如,解釋器不會抱怨如下:

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

儘管沒有進口的,這仍然是有效的代碼。您當然不能撥打say_footalk,但不會收到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特有的。

相關問題