Używam klas abstrakcyjnych w Pythonie z ABCMeta
. Gdy piszesz abstrakcyjną metodę, oznaczasz ją dekoratorem @abstractmethod
. Jedną z rzeczy, którą odkryłem jako nieparzystą (i w odróżnieniu od innych języków) jest to, że gdy podklasa zastępuje metodę nadklasy, nie ma żadnego dekoratora, takiego jak @override
. Czy ktoś wie, jaka może być logika?Dlaczego nie ma dekoratora @override w Pythonie, aby ułatwić odczyt kodu?
To sprawia, że trochę zagmatwane dla kogoś czytającego kod, aby szybko ustalić, które metody zastępują/implementują metody abstrakcyjne w porównaniu do metod, które istnieją tylko w podklasie.
Dlaczego trzeba dostarczyć dekoratora? Dekorator daje możliwość zastąpienia funkcji nowym obiektem, ale nie ma takiej potrzeby w Pythonie, ponieważ dynamicznie wyszukuje nazwy w klasie (np. Późne wiązanie), przeszukując klasy w metodzie MRO (Method Resolution Order) za każdym razem. Zatem metoda zdefiniowana w podklasie maskuje metodę w klasie nadrzędnej * naturalnie *. –
A * celem * abstrakcyjnych metod jest zapewnienie ich wdrożenia; nie można utworzyć instancji klasy, która wciąż zawiera abstrakcyjne metody. Nie należy ich odróżniać od innych metod. –
@ MartijnPieters samo zachowanie (MRO) jest stosowane w Javie. Adnotacja '@ Override' służy jedynie do pomocy programistom przy pisaniu listów podczas kompilacji (jeśli na przykład nazwa metody zawiera literówkę). – alfasin