2016-10-19 9 views
0

안녕하세요, 저는 Cmd 모듈을 사용하여 파이썬에서 중첩 된 인터프리터를 만들려고합니다.중첩 된 Cmd 인터프리터를 파이썬으로 인스턴스화하십시오.

프로젝트를 쉽게 확장 할 수 있기 때문에 (즉, 새 파이썬 파일을 폴더에 추가하고로드 할 수있는 주 코드를 변경하지 않고) 동적 모듈로드를 설정했습니다. 중첩 된 인터프리터를 만들기 위해 나는 SubConsole 클래스에 두 번째 변수로 MainConsole을 통과해야하기 때문에

def instantiateConsole(base): 

    class SubConsole(cmd.Cmd, base): 
     def __init__(self): 
      cmd.Cmd.__init__(self) 

     def do_action(self,args): 
      print "Action" 
    return SubConsole 

이 필요합니다 :

내 중첩 된 인터프리터는 현재이 같은 설정입니다. 이 문제는이 방법으로 클래스를 생성 할 수 있고이 메소드 내부에 정의를 가지지 않고 동적으로로드 할 수있는 새로운 콘솔 모듈 파일을 추가 할 수 없다는 점에서 문제가 있습니다.

해결 방법이 있습니까?

+0

'MainConsole'을 전달하는 예를 들려 줄 수 있습니까? –

답변

0

"MainConsole을 두 번째 변수로 전달"하면 "새 SubConsole을 MainConsole의 하위 클래스로 만듭니다"라는 의미로 나타납니다. 기본 클래스를 인수로 취하는 클래스 팩터 리를 효과적으로 정의하고 있습니다.

"이 메서드 내부에서 클래스 만들기"라고 말하면 함수에 instantiateConsole이 나타납니다. 용어에 대해주의하는 것이 중요합니다.

아무 것도 instantiateClass에 대한 인수로 사용할 수도있는 다른 기본 클래스 (포함 모듈)의 동적 가져 오기와 관련이 없습니다. 가장 단순한 경우에이 모듈들이 sys.path에 살 수있는 표준 디렉토리를 추가하고 모듈을 이름으로 가져온 다음 기본 클래스를 추출 할 수 있습니다 (단순함을 위해 항상 BaseConsole으로 정의 됨). 기본 클래스의 이름은 다를 수 있다면 당신은 (당신이 이름을 결정 얼마나?)

extension_module = importlib.import_module("my_extension") 
new_console = instantiateConsole(extension_module.BaseConsole) 

과 같은 코드를 실행하는 것입니다 당신이 동적으로 수입 된 확장 모듈 간단한 속성 액세스에 우선 getattr()을 사용해야 할 수도 있습니다 .