2017-12-26 4 views
1

하위 클래스가 어떤 메서드를 오버라이드하지 못하면 raise 함수에 기본 클래스를 구현할 수 있습니다..하위 클래스가 특정 기본 클래스 메서드를 재정의 할 때만 발생합니까?

def some_method(self): 
    raise NotImplementedError 

하지만 반대 할 수있는 방법, 즉 서브 클래스가이 방법를 오버라이드 (override) 않는 경우에만 인상?

감사합니다.

편집 : 난 너무 네임 스페이스 충돌이 여기에 적용되지 않습니다 의 getItem/getattr을 무시 사람들을 방지하기 위해 노력하고있어.

편집 : 이미 하위 클래스 메소드가 기본 클래스 메소드인지 확인하려고했습니다. 이것은 CPython에서 작동하지만 PyPy에서는 작동하지 않습니다. 모든 주변 솔루션이 있습니까?

+2

? 그냥 이중 밑줄 규칙을 사용해야할까요? –

+0

[Python이 구현 클래스 이름에서 구현 클래스 이름 충돌을 피할 수 있습니다] (https://stackoverflow.com/questions/30543615/python-avoiding-implementation-method-name-clashes-in-subclass) –

+0

나는 '__getitem__/__getattr__'을 재정의하십시오 –

답변

0

당신은 방법은 슈퍼 클래스와 동일한 방법 개체인지 여부를 확인할 수는 :

물론
def is_base_impl(obj): 
    return obj.__getattr__ is BaseClass.__getattr__ 

, 이것은 단지 의도하지 않은 최우선을 감지; 서브 클래스가 이것을 결정했다면 대신 BaseClass이라는 원숭이 패치를 사용할 수 있습니다.

+0

이것은 CPython과 함께 작업했지만 PyPy는 아니었다.하지만 어쨌든 도움을 주셔서 감사합니다! –

+2

JIT가있는 경우 모든 배팅이 해제됩니다. 당신은 당신의 질문에 관련 정보를 넣어야합니다. 당신이 이것을 시도한 것과 당신이 사용하고있는 플랫폼 모두. –

+2

솔직히 질문에 실제로 대답하지 않으면이 대답을 받아 들여서는 안됩니다. –

0

__init__() 시간에 을 사용하면 some_method()에 대해 자세히 알 수 있습니다. 그런 다음 필요에 따라 메소드의 동작을 테스트하거나 리포트 할 수 있습니다. 이 문제를 해결

1

한 가지 방법은 메타 클래스를 사용하는 방법이 body의 일부인 경우 다음, 작성시 확인 인상하는 것입니다 당신이 방지하려는 어떤 typeError

class BaseMeta(type): 
    def __new__(cls, name, bases, body): 
     if 'bar' in body: 
      raise TypeError("bad user class") 
     return super().__new__(cls, name, bases, body) 


class Base(metaclass=BaseMeta): 
    def bar(self): 
     return None 


class Derived(object): 
    def bar(self): 
     return 'bar'