2010-06-15 4 views
6

__subclasses__() 메소드를 사용하여 모든 파생 클래스를 나열 할 수없는 것 같습니다.Python __subclasses __() 서브 클래스를 나열하지 않음

import.py 
backends 
     __init__.py 
    --digger 
      __init__.py 
      base.py 
      test.py 
     --plugins 
       plugina_plugin.py 

import.py에서 내가 test.py 전화 해요 : 여기 내 디렉토리 레이아웃입니다. test.py은 차례로 plugins 디렉토리에있는 모든 파일을 반복하여 모두로드합니다. test.py은 다음과 같습니다

import os 
import sys 
import re 

sys.path.append(os.path.join(os.path.abspath(os.path.dirname(os.path.abspath(__file__))))) 
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(os.path.abspath(__file__))), 'plugins')) 

from base import BasePlugin 

class TestImport: 
    def __init__(self): 
     print 'heeeeello' 

     PLUGIN_DIRECTORY = os.path.join(os.path.abspath(os.path.dirname(os.path.abspath(__file__))), 'plugins') 

     for filename in os.listdir (PLUGIN_DIRECTORY): 
      # Ignore subfolders 
      if os.path.isdir (os.path.join(PLUGIN_DIRECTORY, filename)): 
       continue 
      else: 
       if re.match(r".*?_plugin\.py$", filename): 
        print ('Initialising plugin : ' + filename) 
        __import__(re.sub(r".py", r"", filename)) 

     print ('Plugin system initialized') 
     print BasePlugin.__subclasses__() 

__subclasses__() 방법은 어떤 파생 클래스가 표시되지 않는 문제 우리. plugins 디렉토리의 모든 플러그인은 base.py 파일의 기본 클래스에서 파생됩니다.

base.py

은 다음과 같습니다 : 기본 가져 오기 BasePlugin에서

class PluginA(BasePlugin): 
    """ 
    Plugin A 
    """ 
    def __init__(self): 
     pass 

이 사람이 나를 도울 수 :

class BasePlugin(object): 
    """ 
    Base 
    """ 
    def __init__(self): 
     pass 

plugina_plugin.py

은 다음과 같습니다? 나 뭐 잘못 됐니? 나는 이걸로 내 머리를 꽉 찼지만, 그것을 파악하는 것 같지 않아

고마워.

+0

'Initializing plugin : plugina_plugin' 메시지가 보이십니까? – unutbu

+0

예. 팝업. 클래스가 임포트 된 것처럼 보이지만'__subclasses__' 메서드는 어떤 이유로 그것을 나열하지 않습니다. –

+0

문제를 재현하지 못했습니다. 'Print BasePlugin .__ 하위 클래스 __()는'[]'를 산출합니다.아마도 디렉토리 구조를 복사하고 코드를 가능한 가장 단순한 형태로 유지한다면 (문제가 남아있는 경우 각 변경 테스트를 통해) 중간 단계에서 문제의 원인에 대한 단서를 찾을 수 있습니다. 예를 들어, test.py에있는 모든 불필요한 코드를 없애고, 디렉토리 구조를 단순화하고, import.py를 제거하십시오. – unutbu

답변

4

이 있음을 확인할 수 있습니다 볼 수 있습니다. 저는 파이썬 2.6과 함께 WinXP (SP2)를 사용하고 있습니다. PluginB이라는 test.py 파일에 다른 클래스를 추가하여 BasePlugin을 기본 클래스로 사용했습니다. 내가

print PluginA.__mro__ 
    print PluginB.__mro__ 

를했을 때 내가 가진 :

당신이 볼 수 있듯이, 그들은 모두 동일한 기본 플러그인을 사용하고 있지만 자격을 갖춘 이름이 다른
(<class 'plugina_plugin.PluginA'>, <class 'base.BasePlugin'>, <type 'object'>) 
(<class 'backends.digger.test.PluginB'>, <class 'backends.digger.base.BasePlugin'>, <type 'object'>) 

.

from base import BasePlugin 

대신에 :

from backends.digger.base import BasePlugin 

이 그것을 고정 고정 plugina_plugin.py에서이 같은 BasePlugin을 가져 되었기 때문이었다.

+0

이 문제를 조사해 주셔서 감사합니다. 두 개의 서로 다른 정규화 된 이름을 가진 객체가 두 개의 독립적 인 별칭을 가지고 있다고 생각했을 것입니다! – advait

0

아마도 플러그인은 어딘가에 숨어있는 다른 base.py (예 : 플러그인 디렉토리)을 찾고 있습니다. 두 개의 서로 다른 base.py

를 수입하기 경우 python -v
실행 또한 PluginA.__mro__보고와 BasePlugin에서이 다른 base.py 파일이 없었다 올바른

관련 문제