2014-03-09 2 views
0

다른 모듈에서 사용할 객체의 동적 구현을 ​​얻으려고합니다.Python에서 클래스 구현을 동적으로 반환하십시오.

는 그것은

  • get_implementation('Implementation1') 또는
  • get_implementation('Implementation2')
  • 로서 사용될 수있다.

목적은 쉽게 확장 할 수있는 코드입니다. 예를 들어 Implementation3이라는 또 다른 클래스를 추가하여 핵심 기능을 변경하지 않고도 작동시킬 수 있습니다.

좋은 접근 방법이나 권장 사항입니까?

get_implementation(name): 
    if name: 
     return getattr(name) 

class Base() 
    def __init__(self, args1, arg2, arg3, arg4....): 

class Implementation1() 
    def __init__(self, *args): 

class Implementation2() 
    def __init__(self, *args): 
  • 이 좋은 방법인가, 아니면 더 나은 옵션이 있나요?
  • 이것은 Zope 프레임 워크 용입니다. 아마도이를 수행 할 수있는 API를 선택해야합니까?
+1

Zope을 사용하면 구성 요소 레지스트리 (유틸리티 또는 어댑터)를 사용할 수 있지만 이는 유스 케이스에 따라 다릅니다. –

+0

내가 그것을 선택해야하는지 또는 위와 같이 간단하게 유지해야하는지 궁금하십니까? Zope은 많은 기능을 가지고있는 것처럼 보입니다. 위의 코드에는 학습 곡선이 없습니다. Zope Component Registry에는 학습 곡선이 있습니다. 나와 내레이터 모두 – Nishant

+0

하지만 Zope에서 수행하는 모든 작업에 대해 커브를 올라야합니다. :-) –

답변

0

당신은 동적으로 현재 모듈에서 전역 개체에 액세스 할 수 globals()를 사용할 수 있습니다

def get_implementation(name): 
    return globals()[name] 

하지만 호출자는 사용할 수 있습니다

getattr(module, name) 

대신

module.get_implementation(name) 

을 대신 이름이 동적이어야한다면.

Zope을 사용하는 경우 클래스를 유틸리티로 등록하는 것이 좋습니다. 구현을 하나의 모듈로 제한하는 대신 getUtility(interface) 또는 getUtility(interface, name=name)을 사용하여 구현을 조회 할 수 있습니다.이 유틸리티는 모듈 또는 개별 패키지에서 나중에 등록 할 수 있습니다.

+0

발신자에게서 그렇게 할 것입니다. 좋은 팁입니다. 접근법은 괜찮습니까? 아니면 hackish로 간주됩니까? 최근 영원한 일들 나는 개발자보다 해커 다. 그러므로 질문 :-) 나는 가능한 한 많은 것을 듣고 싶다. – Nishant

+0

나는 아래쪽 투표가 어디서 왔는지 확신하지 못 했어! 그것은 내가 필요한 것의 선을 따라 명확하게 보였다. – Nishant

관련 문제