Ich fing an etwas etwas Ähnliches zu tun, grundsätzlich überprüfte die Idee, wann immer eine Methode in einer Basisklasse implementiert wurde oder nicht in einer Unterklasse. Wie ich es ursprünglich gemacht habe, konnte ich nicht erkennen, wann eine Zwischenklasse die Methode tatsächlich implementiert hat.
Meine Workaround für es war eigentlich ziemlich einfach; Einstellen einer Methode Attribut und Testen seiner Anwesenheit später. Hier ist eine Vereinfachung der ganzen Sache:
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
UPDATE: Eigentlich method()
von run_method()
nennen (nicht, dass der Geist?) Und haben es alle Argumente übergeben unverändert an das Verfahren.
S.S .: Diese Antwort beantwortet die Frage nicht direkt. Meiner Meinung nach gibt es zwei Gründe, warum man wissen möchte, welche Klasse eine Methode definiert hat; Zuerst werden Finger auf eine Klasse im Debug-Code (wie in der Ausnahmebehandlung) gezeigt, und zweitens wird festgestellt, ob die Methode neu implementiert wurde (wobei Methode ein Stub ist, der vom Programmierer implementiert werden soll). Diese Antwort löst diesen zweiten Fall auf andere Weise.
Welche Version von Python verwenden Sie? Vor 2.2 konnten Sie im_class verwenden, aber das wurde geändert, um den Typ des gebundenen Selbstobjekts anzuzeigen. –
Gut zu wissen. Aber ich benutze 2.6. –