Я начал делать что-то похожее, в основном идея заключалась в том, чтобы проверять, был ли реализован метод в базовом классе или нет в подклассе. Оказалось, как я это делал изначально, я не мог определить, когда промежуточный класс действительно реализовывал метод.
На самом деле мой обходной путь был довольно простым; установка атрибута метода и проверка его наличия позже. Вот упрощение всего:
class A():
def method(self):
pass
method._orig = None # This attribute will be gone once the method is implemented
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() # ==> Raises Exception: method not implemented
C().run_method() # OK
D().run_method() # OK
ОБНОВЛЕНИЕ: на самом деле вызовите method()
из run_method()
(разве это не дух?) И передайте все аргументы методу без изменений.
P.S .: Этот ответ не дает прямого ответа на вопрос. ИМХО, есть две причины, по которым нужно знать, какой класс определяет метод; первый - указать пальцем на класс в отладочном коде (например, при обработке исключений), а второй - определить, был ли метод повторно реализован (где метод - это заглушка, предназначенная для реализации программистом). Этот ответ решает второй случай другим способом.
person
Thomas Guyot-Sionnest
schedule
15.10.2014