2017-12-22 9 views
1

메서드에 입력되는 문자열에서 클래스를 동적으로 인스턴스화하려고합니다.locate를 사용하여 클래스를 동적으로 인스턴스화

from pydoc import locate 
name = "folder.subfolder.classname" 
my_class = locate(name) 
instance = my_class() 

이 오류를 초래 하 :

TypeError: 'module' object is not callable 

내 질문은 : 어떻게 dinamically 내가 호출 할 필요가있는 클래스를 알 수 있는가? 값을 하드 코드하고 my_class.classname()을 인스턴스화 할 수는 있지만 마지막 부분을 하드 코드 대신 동적으로하고 싶습니다. 어떻게해야합니까?

답변

2

편집 2 :

이 솔루션은 사용자가 제공하는 모듈에서 사용할 수있는 모든 클래스를 수집하고 단순히 첫 번째 클래스를 인스턴스화합니다.

import inspect 
from pydoc import locate 
name = "folder.subfolder.classname" 
my_module = locate(name) 

all_classes = inspect.getmembers(my_module, inspect.isclass) 
if len(all_classes) > 0: 
    instance = all_classes[0][1]() 

편집 : 나는 다음과 같은 코드가 사용하는 경우에 작동합니다 생각 코멘트에서 수집

가 :

from pydoc import locate 
name = "folder.subfolder.classname" 
my_module = locate(name) 
class_name = name.rsplit('.')[-1] 
my_class = getattr(my_module, class_name) 
instance = my_class() 

당신은 조금 혼란 것으로 보인다 않는 것을 모듈로 우리의 잘못된 의사 소통을 가져 왔습니다. class.py는 클래스가 아니라 모듈을 가리 킵니다. 이 모듈 (class.py 파일)에는 여러 클래스가있을 수 있습니다. 위의 대답을 위해 나는 class.py 파일에 파일과 같은 이름의 클래스가 있다고 가정합니다.

원래 답변 :

아니라 오류 쇼, 당신의 my_class 변수는 실제로 모듈 개체입니다. 제공하는 이름은 실제로 클래스를 가리 키지 않고 클래스를 포함하는 모듈을 가리 킵니다. 귀하의 예제 코드에서이처럼 인스턴스화 할 수처럼 다음

my_class = getattr(module, class_name) 

과 :

은 당신이 할 수있는 문자열로 모듈 객체에서 클래스를 얻으려면

instance = my_class() 

는 모두 가져 오려면 함께 :

+0

글렌. 변수 class_name은 어디에 있습니까? – BlunT

+0

전화하는이 위치 지정 기능에 대한 자세한 정보를 제공 할 수 있습니까? 귀하의 문제가 단순히 모듈 이름을 잊어 버린 사실 인 것처럼 보이기 때문입니다. ''folder.subfolder.classname ""을 사용하는 대신에''folder.subfolder.modulename.classname "'을 사용해 보셔야합니다. 모듈 이름은'.py'가없는 파이썬 파일의 이름입니다. –

+0

locate는 pydoc에서입니다. 질문에 추가했습니다. 구조는 "folder \ subfolder \ class.py"이고 "folder.subfolder.class"로 클래스에 액세스하려고합니다. – BlunT

관련 문제