2011-11-09 2 views
5

나는 다음과 같은 폴더 구조가 : 내 경우, 기본 클래스에서 확장하는 클래스가 모듈 (예를 들어 some_module1.py)의 각 내부파이썬 - 동적 클래스 가져 오기

- MyProject 
    - App1 
     - some_module1.py 
     - some_module2.py 
    - App2 
     - some_other_module1.py 
     - some_other_module2.py 

을, 프로듀서 .

내가하려고하는 일은이 클래스에서 동적으로로드하는 것입니다. 나는 특정 생산자 클래스에 대한 각각의 "응용 프로그램"패키지를 확인하고이에서 확장 확인하는 함수를 작성하는 것을 시도하고있다

INSTALLED_APPS = (
    'App1', 
    'App2', 
) 

을 :이를 위해, 나는 다음과 같습니다 "설치된 앱"의 목록을 가지고 생산자 기본 클래스. 다음과 같은 것 :

module_class = 'some_module1.SomeClass' 

# Loop through each package in the INSTALLED_APPS tuple: 
for app in INSTALL_APPS: 
    try: 
     #is the module_class found in this app? 
     #App1.some_module1.SomeClass - Yes 
     #App2.some_module1.SomeClass - No 

     # is the class we found a subclass of Producer? 
    exception ImportError: 
     pass 

나는 imp와 importlib를 시도했지만이 종류의 가져 오기를 처리하지 못했습니다. 어쨌든 내가이 일을 성취 할 수 있을까?

+0

죄송합니다 - 원하는 것을 알아낼 수 없으므로 의사 코드가 명확하지 않습니다. 파이썬은 적절한 장소에서 나오는 abse 클래스를 처리합니다. 그래서 App1.Class_는 App1 모듈 안에 정의 된 "Producer"를 볼 것입니다. – jsbueno

+0

죄송합니다. 가능한 한 명확하게하려고 노력했습니다. 나는 포스트에 편집하고 그것이 더 의미가 있기를 바란다. – Hanpan

답변

5

당신은 한 번 봐 가지고 할 수 있습니다 : 문자열로 자신의 이름을 알고있는 모듈을 가져

  • __import__()을;
  • dir() 모듈의 모든 객체 (속성, 함수 등)의 이름을 가져옵니다.
  • inspect.isclass(getattr(<module ref>, <object name>)) 모듈의 객체들 사이의 클래스를 식별한다.
  • issubclass()은 주어진 클래스의 하위 클래스를 식별하기 위해 as explained here입니다.

이 도구를 사용하면 주어진 모듈에서 주어진 클래스를 상속하는 모든 클래스를 식별 할 수 있습니다.

이 메커니즘을 사용하면 지정된 모듈에서 클래스를 동적으로 인스턴스화하여 업데이트가 자동으로 상위 수준에서 고려됩니다.