2012-07-13 4 views
0

(a) 모듈 내에서 함수를 동적으로 호출하는 방법은 무엇입니까? 예를 들어함수를 동적으로 호출하는 방법은 무엇입니까?

:

class Class1(object): 
    pass 

class Class2(object): 
    pass 

# here I want to either instantiate object dynamically or dynamically pass 
# a Class1 or Class2 object to some other method/class inside this module code 
+0

좀 더 구체적이어야합니다. 아마도 좀 더 코딩 된 예제일까요? –

+0

지금까지 해보신 것은 무엇입니까? 파이썬에서는 다른 객체와 마찬가지로 클래스를 전달할 수 있습니다. – Philipp

+1

파이썬은 약한 형식입니다. 어느 한 타입의 객체를 어떤 함수로 건네는 것에서 만 제한 할 수있는 것이 아무것도 없다. – Wug

답변

4

,

(module 모듈이 아닌 문자열에 대한 참조입니다. classname 클래스의 이름이 포함 된 문자열입니다)?

>>> class Class1(object): 
...  pass 
... 
>>> class Class2(object): 
...  pass 
... 
>>> def foo(cls): 
...  print cls 
... 
>>> import random 
>>> classes = {'Class1': Class1, 'Class2': Class2} 
>>> dynamic_class = classes['Class%d' % random.randint(1, 2)] 
>>> foo(dynamic_class()) 
<__main__.Class1 object at 0x10b44ab50> 
+1

이 예제는'locals()'에 의해 반환되는 사전을 명시 적으로 생성하면 좀 더 건설적인 것이라고 생각합니다. – mgilson

+0

@mgilson : 업데이트되었습니다. 노골적인 표현이 더 좋습니다. – sberry

+0

동의. (+1) 귀하의 노력 (그리고 좋은 예) – mgilson

2

난 당신이 이름으로 클래스에 액세스 할 의미 있으리라 믿고있어.

원하는 클래스가 동일한 모듈에 있으면 globals()[classname]()을 사용해 클래스를 인스턴스화하십시오. 다른 모듈에있는 경우 vars(module)[classname]() 또는 getattr(module, classname)()을 사용해보십시오. 당신이 뭔가를 의미

+0

'vars (module) [classname]()'을 본 적이 없다. 이것을 getattr보다 선호하는 이유가 있습니까? (아니면 다른 토마토, 토마토 것입니까?) – mgilson

+0

globals()와 비슷하기 때문에'vars (modules)'와 비슷합니다. 나머지는 똑같이 사전을 되 찾을 수 있습니다. 그렇지 않으면, 맛의 문제, 나는 생각한다. – kindall

관련 문제