Kann eine abstrakte Klasse die erbende Klasse zwingen, eine Methode als statisch zu implementieren?

8

Python 3.2, falls das wichtig ist ...

Der folgende Code zeigt, dass die "konkrete Klasse" some_method entweder als statische Methode oder als Instanzmethode implementieren kann:

%Vor%

Meine Frage ist, kann ich die Implementierung von some_method in der erbenden Klasse statisch machen?

Ich bemerkte @ abc.abstractstaticmethod und dachte, das wäre die Antwort, aber der folgende Code läuft immer noch gut. Ich würde denken, dass es ValidConreteClass2 zurückweisen würde, weil some_method nicht statisch ist:

%Vor%     
Matthew Lund 08.12.2011, 21:17
quelle

1 Antwort

2

Ich denke, einige Klarstellungen sind notwendig;

Erstens, in Python ist jede Methode virtuell - wirklich virtuell; Ob eine Methode also statisch ist oder an eine Klasse oder Instanz gebunden ist, hängt von der Unterklasse und nicht von der übergeordneten Klasse ab. Sie haben keinen wirklichen Grund, das zu verhindern - was ist Ihr Ziel?

Zweitens prüfen ABCs bei der Instanziierungszeit auf Abstraktheit - wenn Sie versuchen, eine Klasse zu instanziieren, die immer noch eine abstrakte Methode hat, wird ein Fehler ausgelöst. Aber ABCs können nichts an statischen oder Klassenmethoden tun, die von der Klasse selbst aufgerufen werden - es wird KEINE CHECK für die Methode selbst ausgeführt, nur ein Attribut für die Methode - es ist ABCMeta, das die Drecksarbeit ausführt, wenn die Klasse instanziiert wird.

Drittens besteht der Zweck von abstractstaticmethod darin, eine abstrakte Methode - also etwas, das von Unterklassen immer noch überschrieben werden muss - zu erlauben, statisch zu sein und von überall verwendet zu werden - auch hier gibt es keine Überprüfung der Methode selbst Code ist vollkommen legal:

%Vor%

Der einzige Grund für die Existenz von abstractstaticmethod / abstractclassmethod ist, dass das Folgende nicht funktioniert, da bei dekorierten Methoden ein dict

fehlt %Vor%

Eine letzte Sache: Wenn Sie wirklich wollen, könnten Sie wahrscheinlich eine solche Funktionalität hinzufügen, indem Sie ABCMeta erweitern, aber ich werde Ihnen keinen Anhaltspunkt dafür geben, wie Sie das tun können, wenn Sie mir nicht sagen, warum Sie das tun: -)

    
Alan Franzoni 08.12.2011, 22:52
quelle

Tags und Links