In meiner Python-App möchte ich eine Methode erstellen, die sowohl a staticmethod
als auch an ist abc.abstractmethod
. Wie mache ich das?
Ich habe versucht, beide Dekorateure anzuwenden, aber es funktioniert nicht. Wenn ich das mache:
import abc
class C(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
@staticmethod
def my_function(): pass
Ich bekomme eine Ausnahme * und wenn ich das mache:
class C(object):
__metaclass__ = abc.ABCMeta
@staticmethod
@abc.abstractmethod
def my_function(): pass
Die abstrakte Methode wird nicht erzwungen.
Wie kann ich eine abstrakte statische Methode erstellen?
*Die Ausnahme:
File "c:\Python26\Lib\abc.py", line 29, in abstractmethod
funcobj.__isabstractmethod__ = True
AttributeError: 'staticmethod' object has no attribute '__isabstractmethod__'
python
abstract-class
static-methods
Ram Rachum
quelle
quelle
Antworten:
quelle
import abc
; sowie eine Unterklasse, die die Instanziierung von A. (z. B.class B(A):\n @staticmethod\n def test():\n print 10\n
) zeigt__isabstractmethod__
Attribut haben.abstractstatic
vorgeschaltet werdenabc.py
?Ab Python 3.3 ist es möglich,
@staticmethod
und@abstractmethod
daher ist keiner der anderen Vorschläge mehr erforderlich:quelle
@staticmethod
als erstes setzen müssen, sonst erhalten SieAttributeError: attribute '__isabstractmethod__' of 'staticmethod' objects is not writable
@property
Dies wird es tun:
Sie gehen zu "Eh? Es benennt nur @abstractmethod um", und das ist völlig richtig. Weil jede Unterklasse der oben genannten sowieso den @ staticmethod-Dekorator enthalten muss. Sie brauchen es hier nicht, außer als Dokumentation beim Lesen des Codes. Eine Unterklasse müsste folgendermaßen aussehen:
Um eine Funktion zu haben, die Sie dazu zwingen würde, diese Methode zu einer statischen Methode zu machen, müssten Sie ABCmeta in eine Unterklasse unterteilen, um dies zu überprüfen und zu erzwingen. Das ist viel Arbeit für keine wirkliche Rückkehr. (Wenn jemand den @ staticmethod-Dekorator vergisst, wird ohnehin ein klarer Fehler angezeigt, statische Methoden werden nur nicht erwähnt.
Tatsächlich funktioniert das also genauso gut:
Update - Eine andere Möglichkeit, es zu erklären:
Dass eine Methode statisch ist, steuert, wie sie aufgerufen wird. Eine abstrakte Methode wird niemals aufgerufen. Und abstrakte statische Methoden sind daher ein ziemlich sinnloses Konzept, außer zu Dokumentationszwecken.
quelle
Dies ist derzeit in Python 2.X nicht möglich, wodurch die Methode nur abstrakt oder statisch erzwungen wird, nicht jedoch beide.
In Python 3.2+ wurden die neuen Dekoratoren
abc.abstractclassmethod
undabc.abstractstaticmethod
hinzugefügt, um ihre Durchsetzung von abstrakt und statisch oder abstrakt und eine Klassenmethode zu kombinieren.Siehe Python-Ausgabe 5867
quelle
abstractclassmethod
undabstractstaticmethod
wurden in Python 3.3 sowie schnell veraltetabstractproperty
. docs.python.org/3/library/abc.html