Klasę abstrakcyjną można uznać za wzór dla innej zajęcia . Umożliwia utworzenie zestawu metod, które należy utworzyć w obrębie dowolnych klas potomnych zbudowanych z klasy abstrakcyjnej.
Klasa zawierająca jedną lub więcej metod abstrakcyjnych nazywana jest klasą klasa abstrakcyjna . Jakiś metoda abstrakcyjna to metoda, która ma deklarację, ale nie ma implementacji.
Klasy abstrakcyjnej używamy podczas projektowania dużych jednostek funkcjonalnych lub gdy chcemy zapewnić wspólny interfejs dla różnych implementacji komponentu.
Abstrakcyjne klasy bazowe w Pythonie
Definiując abstrakcyjną klasę bazową, można zdefiniować klasę wspólną Interfejs programu aplikacji (API) dla zestawu podklas. Ta funkcja jest szczególnie przydatna w sytuacjach, gdy strona trzecia będzie dostarczać implementacje, np. z wtyczkami, ale może również pomóc podczas pracy w dużym zespole lub z dużą bazą kodu, gdzie utrzymanie wszystkich klas w pamięci jest trudne lub nie możliwy.
lista Java
Praca nad klasami abstrakcyjnymi w Pythonie
Domyślnie, Pyton nie zapewnia klasy abstrakcyjne . Python jest dostarczany z modułem, który zapewnia podstawę do definiowania A bstract Klasy bazowe (ABC) a nazwa modułu to ABC .
ABC działa poprzez dekorowanie metod klasy bazowej jako abstrakcyjnej, a następnie rejestrowanie konkretnych klas jako implementacji abstrakcyjnej bazy. Metoda staje się abstrakcyjna, gdy jest ozdobiona słowem kluczowym @abstractmethod.
Przykład 1:
Ten kod definiuje abstrakcyjną klasę bazową o nazwie Wielokąt przy użyciu modułu ABC (Abstract Base Class) w Pythonie. Klasa Polygon posiada metodę abstrakcyjną o nazwie noofsides które muszą zostać zaimplementowane przez jego podklasy.
konstruktor strun
Zdefiniowano cztery podklasy wielokąta: trójkąt, pięciokąt, sześciokąt i czworokąt. Każda z tych podklas zastępuje metodę noofsides i zapewnia własną implementację poprzez wypisanie liczby posiadanych boków.
W kodzie sterownika tworzone są instancje każdej podklasy, a dla każdej instancji wywoływana jest metoda noofsides w celu wyświetlenia liczby boków charakterystycznych dla tego kształtu.
Pyton # Python program showing # abstract base class work from abc import ABC, abstractmethod class Polygon(ABC): @abstractmethod def noofsides(self): pass class Triangle(Polygon): # overriding abstract method def noofsides(self): print('I have 3 sides') class Pentagon(Polygon): # overriding abstract method def noofsides(self): print('I have 5 sides') class Hexagon(Polygon): # overriding abstract method def noofsides(self): print('I have 6 sides') class Quadrilateral(Polygon): # overriding abstract method def noofsides(self): print('I have 4 sides') # Driver code R = Triangle() R.noofsides() K = Quadrilateral() K.noofsides() R = Pentagon() R.noofsides() K = Hexagon() K.noofsides()> Wyjście
I have 3 sides I have 4 sides I have 5 sides I have 6 sides>
Przykład 2:
Tutaj ten kod definiuje abstrakcyjną klasę bazową o nazwie Animal przy użyciu modułu ABC (Abstract Base Class) w Pythonie. Klasa Animal posiada nieabstrakcyjną metodę zwaną move, która nie ma żadnej implementacji. Istnieją cztery podklasy zwierząt: Człowiek, Wąż, Pies i Lew. Każda z tych podklas zastępuje metodę move i zapewnia własną implementację poprzez wydrukowanie określonej charakterystyki ruchu.
indeks górny w ilustratorzePyton
# Python program showing # abstract base class work from abc import ABC, abstractmethod class Animal(ABC): def move(self): pass class Human(Animal): def move(self): print('I can walk and run') class Snake(Animal): def move(self): print('I can crawl') class Dog(Animal): def move(self): print('I can bark') class Lion(Animal): def move(self): print('I can roar') # Driver code R = Human() R.move() K = Snake() K.move() R = Dog() R.move() K = Lion() K.move()> Wyjście
I can walk and run I can crawl I can bark I can roar>
Implementacja abstraktu poprzez podklasę
Dokonując podklasy bezpośrednio z bazy, możemy uniknąć konieczności jawnej rejestracji klasy. W tym przypadku do rozpoznawania wykorzystywane jest zarządzanie klasami Pythona Implementacja wtyczki jako wdrażanie abstrakcyjna baza wtyczek .
Pyton # Python program showing # implementation of abstract # class through subclassing import abc class parent: def geeks(self): pass class child(parent): def geeks(self): print('child class') # Driver code print( issubclass(child, parent)) print( isinstance(child(), parent))> Wyjście
True True>
Skutkiem ubocznym stosowania bezpośredniego podklasy jest to, że można znaleźć wszystkie implementacje wtyczki, pytając klasę bazową o listę znanych klas z niej wywodzących.
Metody konkretne w abstrakcyjnych klasach podstawowych
Klasy konkretne zawierają tylko metody konkretne (normalne), podczas gdy klasy abstrakcyjne mogą zawierać zarówno metody konkretne, jak i metody abstrakcyjne.
Klasa konkretna zapewnia implementację metod abstrakcyjnych, abstrakcyjna klasa bazowa może również zapewnić implementację, wywołując metody za pomocą super(). Przyjrzyjmy się przykładowi wywołania metody za pomocą super():
Pyton # Python program invoking a # method using super() from abc import ABC class R(ABC): def rk(self): print('Abstract Base Class') class K(R): def rk(self): super().rk() print('subclass ') # Driver code r = K() r.rk()> Wyjście
Abstract Base Class subclass>
W powyższym programie możemy wywołać metody klas abstrakcyjnych za pomocą Super().
Właściwości abstrakcyjne w Pythonie
Klasy abstrakcyjne oprócz metod zawierają atrybuty. Możesz wymagać atrybutów w konkretnych klasach, definiując je za pomocą @abstractproperty.
program w Pythonie do wyszukiwania binarnegoPyton
# Python program showing # abstract properties import abc from abc import ABC, abstractmethod class parent(ABC): @abc.abstractproperty def geeks(self): return 'parent class' class child(parent): @property def geeks(self): return 'child class' try: r = parent() print(r.geeks) except Exception as err: print(err) r = child() print(r.geeks)>
Wyjście
Can't instantiate abstract class parent with abstract methods geeks child class>
W powyższym przykładzie nie można utworzyć instancji klasy Base, ponieważ ma ona jedynie abstrakcyjną wersję metody pobierającej właściwości.
Tworzenie instancji klasy abstrakcyjnej
Klasy abstrakcyjne są niekompletne, ponieważ mają metody, których nie ma nikt. Jeśli Python pozwala na utworzenie obiektu dla klas abstrakcyjnych, wówczas użyj tego obiektu, jeśli ktoś wywoła metodę abstrakcyjną, ale nie ma rzeczywistej implementacji do wywołania.
Używamy więc klasy abstrakcyjnej jako szablonu i w zależności od potrzeb rozszerzamy ją i budujemy na niej, zanim będziemy mogli z niej skorzystać. Z uwagi na fakt, że klasa abstrakcyjna nie jest klasą konkretną, nie można jej utworzyć. Kiedy tworzymy obiekt dla klasy abstrakcyjnej, to zgłasza błąd .
Pyton # Python program showing # abstract class cannot # be an instantiation from abc import ABC,abstractmethod class Animal(ABC): @abstractmethod def move(self): pass class Human(Animal): def move(self): print('I can walk and run') class Snake(Animal): def move(self): print('I can crawl') class Dog(Animal): def move(self): print('I can bark') class Lion(Animal): def move(self): print('I can roar') c=Animal()> Wyjście:
Traceback (most recent call last): File '/home/ffe4267d930f204512b7f501bb1bc489.py', line 19, in c=Animal() TypeError: Can't instantiate abstract class Animal with abstract methods move>