2011-08-03 3 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의 명칭은 의미가 없습니다. 파이썬의 모듈 수준에는 "메소드"가 없습니다.) –

+0

@Sven, 저는 shld가 메소드가 아니라 함수라고 말 했나요?! – user739807

+0

예, 파이썬으로 호출하는 방법입니다.하지만이 설명은 단지 부수적 인 내용이었습니다.나의 요점은 당신이하려고하는 것이별로 의미가 없다는 것입니다. –

답변

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

무엇? method1method2foo 클래스로 "가져 오기"되지 않았습니다. 모듈에 가져 오기 때문에 dir(foomodule)이 표시됩니다. 그러나 foo에서 method1까지는 참조가 없습니다.

3

잔인하게 정직하게하려면, 당신의 질문은 많은 이해하고, 여기에하지 않는 이유 :

foosay_foo에 의해 호출 된 두 개의 전역 사이에 어떤 연결이되지 않습니다 정의 된 시점에서

talk 및 코드 상단에 두 가지 함수를 가져 왔습니다.

예를 들어, 인터프리터는 다음에 대해 불평하지 않습니다 수입의 부재에도 불구하고

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

이 여전히 유효한 코드입니다. 당연히 NameError을 얻지 않고 say_footalk으로 전화 할 수는 없습니다.

다음

도 괜찮 : 나는 때 호출됩니다있는 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과 관련이 있습니다.

관련 문제