W mojej aplikacji w języku Python chcę utworzyć metodę, która będzie jednocześnie staticmethod
rozszerzeniem a i abc.abstractmethod
. Jak mam to zrobic?
Próbowałem zastosować oba dekoratory, ale to nie działa. Jeśli to zrobię:
import abc
class C(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
@staticmethod
def my_function(): pass
Dostaję wyjątek *, a jeśli to zrobię:
class C(object):
__metaclass__ = abc.ABCMeta
@staticmethod
@abc.abstractmethod
def my_function(): pass
Metoda abstrakcyjna nie jest egzekwowana.
Jak mogę stworzyć abstrakcyjną metodę statyczną?
*Wyjątek:
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
źródło
źródło
Odpowiedzi:
źródło
import abc
na górze; a także podklasę, która pokazuje instancję A. (np.class B(A):\n @staticmethod\n def test():\n print 10\n
)__isabstractmethod__
atrybut.abstractstatic
dodać doabc.py
?Począwszy od Pythona 3.3 , jest możliwe łączenie
@staticmethod
i@abstractmethod
, więc żadne inne sugestie są już konieczne:źródło
@staticmethod
jako pierwszy, albo dostanieszAttributeError: attribute '__isabstractmethod__' of 'staticmethod' objects is not writable
@property
To zrobi to:
Mówisz „Eh? Po prostu zmienia nazwę @abstractmethod” i jest to całkowicie poprawne. Ponieważ każda podklasa powyższego i tak będzie musiała zawierać dekorator @staticmethod. Nie potrzebujesz tego tutaj, z wyjątkiem dokumentacji podczas czytania kodu. Podklasa musiałaby wyglądać tak:
Aby mieć funkcję, która zmusiłaby cię do uczynienia tej metody metodą statyczną, musiałbyś podklasę ABCmeta, aby to sprawdzić i wymusić. To dużo pracy bez realnego zwrotu. (Jeśli ktoś zapomni dekoratora @staticmethod i tak otrzyma wyraźny błąd, po prostu nie wspomina o metodach statycznych.
W rzeczywistości działa to równie dobrze:
Aktualizacja - inny sposób, aby to wyjaśnić:
To, że metoda jest statyczna, kontroluje sposób jej wywoływania. Metoda abstrakcyjna nigdy nie jest wywoływana. Dlatego abstrakcyjna metoda statyczna jest pojęciem dość bezcelowym, z wyjątkiem celów dokumentacyjnych.
źródło
Obecnie nie jest to możliwe w Pythonie 2.X, który wymusza tylko abstrakcyjną lub statyczną metodę, ale nie obie.
W Pythonie 3.2+ nowe dekoratory
abc.abstractclassmethod
iabc.abstractstaticmethod
zostały dodane w celu połączenia ich egzekwowania bycia abstrakcyjnymi i statycznymi lub abstrakcyjnymi i metodą klas.Zobacz wydanie Pythona 5867
źródło
abstractclassmethod
iabstractstaticmethod
zostały szybko wycofane w Pythonie 3.3, a takżeabstractproperty
. docs.python.org/3/library/abc.html