2014-06-08 3 views
0

내 클래스에서 파생 된 모든 클래스가 특정 메서드를 재정의하도록하려는 경우. 그것들이 오버라이드 (override)되지 않는다면, 메소드 중 하나가 호출 될 때가 아니라 컴파일이 시작된 후 가능한 한 빨리 NotImplementedError를 발생시키고 싶습니다.메서드가 재정의되었는지 확인

난과 같이 메타 클래스와 함께 할 수 있다는 것을 발견했습니다 method_a 또는 method_b가 BaseClass로에서 파생 된 클래스에 의해 오버라이드 (override)하지 않는 경우

class MetaBaseClass(type): 
    # list of method names which should be overridden 
    to_override = ['method_a', 'method_b'] 

    def __init__(cls, name, bases, dct): 
     for methodName in cls.to_override: 
      if methodName not in dct: 
       raise NotImplementedError('{0} must override the {1} method'.format(name, methodName)) 
     super(MetaBaseClass, cls).__init__(name, bases, dct) 

class BaseClass(object): 

    __metaclass__ = MetaBaseClass 

    def method_a(self): 
     pass 

    def method_b(self): 
     pass 

이 클래스 정의시 오류가 발생합니다.

더 좋은 방법이 있나요?

+2

FYI 이것은 컴파일 시간이 아니며, 일반적으로 모듈 가져 오기 시간 인 클래스 정의 시간입니다. 하지만 클래스는 조건부로 정의 될 수도 있습니다 (따라서이 테스트는 실행되지 않습니다). 응용 프로그램을 실행하는 동안 언제든지 호출되는 내부 함수. – delnan

+0

@delnan 감사합니다. 가능한 한 빨리 오류를 제기하고 싶습니다. 나는 그 말을 고쳐 쓸거야. – Griffin

답변

0

왜 abstractmethod를 사용하지 않습니까?

from abc import abstractmethod, ABCMeta 
class BaseClass(object): 

    __metaclass__ = ABCMeta 

    @abstractmethod 
    def method_a(self): 
     pass 
    @abstractmethod 
    def method_b(self): 
     pass 

class Inherit(BaseClass): 
    pass 

사용자가 상속 클래스를 인스턴스화하려고하자마자 오류 메시지가 표시됩니다.

i = Inherit() 
TypeError: Can't instantiate abstract class Inherit with abstract methods method_a, method_b 
+0

답변 해 주셔서 감사합니다. 나는 추상적 인 방법에 대해 몰랐다. 그러나 나의 방법은이 오류보다 더 빨리 오류를 제기하는 것처럼 보일 것입니다. 가능한 한 디버깅으로 많은 시간을 절약하려고합니다. – Griffin

+0

나는 단순한'if __name __ == "__main__"Inherit() 등이 똑같은 일을한다고 생각한다. –

관련 문제