나는 다소 비슷한 일을 시작했다. 기본적으로 기본 클래스의 메서드가 하위 클래스에 구현되었는지 여부를 확인하는 것이 었습니다. 내가 원래했던 방식으로 밝혀 졌는데 중간 클래스가 실제로 메서드를 구현하고있을 때 감지 할 수 없었습니다.
내 해결 방법은 실제로 매우 간단했습니다. 메소드 속성을 설정하고 나중에 그 존재를 테스트합니다. 다음은 전체를 단순화 한 것입니다.
class A():
def method(self):
pass
method._orig = None
def run_method(self, *args, **kwargs):
if hasattr(self.method, '_orig'):
raise Exception('method not implemented')
self.method(*args, **kwargs)
class B(A):
pass
class C(B):
def method(self):
pass
class D(C):
pass
B().run_method()
C().run_method()
D().run_method()
업데이트 : 실제로 (정신이 아닌가?) method()
에서 호출 하고 run_method()
수정되지 않은 모든 인수를 메서드에 전달합니다.
추신 :이 답변은 질문에 직접 답하지 않습니다. IMHO 메서드를 정의한 클래스를 알고 싶은 두 가지 이유가 있습니다. 첫 번째는 디버그 코드 (예 : 예외 처리)에서 클래스를 가리키는 손가락이고, 두 번째는 메서드가 다시 구현되었는지 확인하는 것입니다 (여기서 메서드는 프로그래머가 구현할 스텁). 이 답변은 두 번째 경우를 다른 방식으로 해결합니다.