2011-08-03 6 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()'の実行中に、このグローバル名が実行時に指し示すオブジェクトに名前が解決されます。これは、 'say_foo()'の定義時に 'method1'が指しているものとは全く異なるオブジェクトかもしれません。 (さらに、 'from module1 import method1'の命名法はあまり意味がありません。Pythonのモジュールレベルには「メソッド」はありません。) –

+0

@Sven、私はshldメソッドをメソッドよりも言っていますか? – 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

何ですか? method1およびmethod2は、fooクラスに「インポートされていません」。モジュールにインポートされるので、dir(foomodule)が表示されます。しかし、fooからmethod1への参照はありません。

3

残酷に正直に言うと、あなたの質問には意味の全体の多くを作成し、ここに理由はありません。

fooが定義されている時点では、何も接続はsay_fooで呼ばれる2つのグローバル変数の間で行われていないとtalkと2つの関数をコードの先頭にインポートします。例えば

、インタプリタは次のように文句はありません。

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

輸入の不在にもかかわらず、これはまだ有効なコードです。あなたはもちろんとtalkNameErrorなしで呼び出すことはできません。

も結構です:私は時に呼び出されるどの method1把握するためにあなたに残し

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() 

今、すべてのことを言って、あなたが何かがありますします。あなたがメソッドオブジェクトの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固有のものです。あなたのコードを分析する