Przeczytałem docs Pythona o abstrakcyjnych klas bazowych:pyton @abstractmethod dekorator
Od here:
abc.abstractmethod(function)
dekorator wskazujący metody abstrakcyjne.Korzystanie z tego dekoratora wymaga, aby metaclass klasy był
ABCMeta
lub pochodził z niej klasaABCMeta
lub . Klasa, która ma metaklas pochodzący odABCMeta
, nie może być utworzona, chyba że wszystkie jej abstrakcyjne metody i właściwości zostaną nadpisane.
I here
Można zastosować
@abstractmethod
dekorator do metod, takich jak Draw() , które muszą być wdrożone; Python podniesie wyjątek dla klas , które nie definiują metody. Zauważ, że wyjątek jest tylko podniesiony, gdy faktycznie próbujesz utworzyć instancję podklasy bez tej metody.
Użyłem tego kodu, aby sprawdzić, czy na zewnątrz:
import abc
class AbstractClass(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def abstractMethod(self):
return
class ConcreteClass(AbstractClass):
def __init__(self):
self.me = "me"
c = ConcreteClass()
c.abstractMethod()
Kod idzie dobrze, więc ja nie rozumiem. Jeśli wpiszę: c.abstractMethod
, otrzymam:
<bound method ConcreteClass.abstractMethod of <__main__.ConcreteClass object at 0x7f694da1c3d0>>
Czego mi tu brakuje? ConcreteClass
musi zastosować metody abstrakcyjne, ale nie mam wyjątków.
Który python? Zgłasza błąd dla mnie. Zawsze możesz też wywołać NotImplementedError zamiast używać 'abc'. –
Dodaję komentarz do odpowiedzi mouad, link z 'python' został ustawiony jako domyślny na' python3'. Będę miał na uwadze podniesienie wyjątku, ponieważ pisanie przenośnego kodu z tymi zmianami na pythonie wydaje się być dalekie od mojej wiedzy Pythona. – Sebastian