2013-06-05 6 views
1

나는 종종 파이썬 코드에서 볼 수있는 코드 패턴을 제출하고 싶습니다. 여기서는 직장에서 만족스럽지 않고 더 나은 솔루션을 원합니다.추상 메서드와 파이썬에서 믹스

class AbstractClass(object): 
    .... 
    def method1(self,...) 
     raise NotImplementedError 
    ... 

class FirstImplementationMixin(object) 
    def method1(self,....) 
     ... 

class SecondImplementationMixin(object) 
    def method1(self...) 
     .... 

class InstanciatedClass1(FirstImplementationMixin, AbstractClass) 
    .... 

class InstanciatedClass2(SecondImplementationMixin, AbstractClass) 
    .... 

당신이 트릭을 볼 수 있나요 : 여기

오늘날 우리가 가지고 무엇인가? 상속의 목록 목록의 첫 번째 위치에 mixin을 추가해야하며이 솔루션이 마음에 들지 않습니다. 두 번째 위치에 추가하면 인터프리터는 AbstractClass.method1을 사용하므로 예외가 발생합니다.

이 간단한 상황에서는 믹스 인을 중간 클래스로 바꾸는 것이 가능하지만 이미 기본 클래스가있는 복잡한 상속의 경우 솔루션이 명확하지 않을 수 있습니다.

당신에게 가장 좋은 디자인 패턴은 무엇입니까?

+1

파이썬이 어떻게 작동하는지. 당신이 당신의 언어로 분리 된 개념으로서 형질/믹스 인을 가지지 않을 때 당신은 단순히 그것들을 클래스들과 혼합합니다. "우선 순위"순으로 수업을 나열하는 것은 매우 자연스러운 일입니다. – kirelagin

답변

0

글쎄, 내 의견에 언급했듯이 이것은 파이썬이 어떻게 작동하는지, 그리고 나는 그것을 바꾸는 것이 좋은 아이디어라고 생각하지 않는다.

그럼에도 불구하고 구조에 metaclasses!
자신 만의 메타 클래스를 만들어 필요한만큼 복잡하게 만들 수 있습니다. 여기서는 아주 기본적인 예제를 보여 드리겠습니다.

def mixed(name, bases, dct): 
    return type(name, bases[1:] + (bases[0],), dct) 

간단히 말하면 첫 번째베이스 클립을 끝까지 이동하기 때문에 실제 믹스를 먼저 수행 한 다음 실제 기본 클래스를 넣습니다. 즉, 단일 기본 클래스로 제한됩니다. 예를 들어 기본 클래스를 먼저 나열한 다음 None을 입력 한 다음 mixins; 그리고 여러분의 메타 클래스는 이것을 None으로 찾고 튜플을 적절하게 재정렬합니다.

class MixinA: 
    pass 

class MixinB: 
    pass 

class Base(object): 
    pass 

class Test(Base, MixinA, MixinB): 
    __metaclass__ = mixed 
>>> Test.__mro__ 
       > 
(<class '__main__.Test'>, 
<class __main__.MixinA at 0x6f8850db48>, 
<class __main__.MixinB at 0x6f8850dae0>, 
<class '__main__.Base'>, 
<type 'object'>) 

은 물론 당신 때문에 메타 클래스를 선택하는 데 사용되는 규칙, 때마다 __metaclass__ 지정되지 않습니다. 아마 모듈 레벨에 __metaclass__을 설정하거나 아마도 믹스 인으로 설정할 것입니다. 코드 구조에 더 잘 맞는 것은 선택 사항입니다.

관련 문제