Абстракция в Python – простое объяснение
Абстракция используется, чтобы скрыть внутренние характеристики функции от пользователей. Пользователи взаимодействуют только с базовой реализацией функции, но внутренняя работа скрыта. Пользователь знаком с тем, «что делает функция», но не знает, «как она работает».
Проще говоря, мы все пользуемся смартфоном и хорошо знакомы с его функциями, такими как камера, диктофон, набор номера и т. д., но мы не знаем, как эти операции выполняются в фоновом режиме. Возьмем другой пример – когда мы используем пульт от телевизора для увеличения громкости. Мы не знаем, как нажатие клавиши увеличивает громкость телевизора. Известно только, что нужно нажимать кнопку «+», чтобы увеличить громкость.
Это именно та абстракция, которая работает в объектно-ориентированной концепции.
Почему важна абстракция?
В Python абстракция используется, чтобы скрыть незначимые данные или класс, чтобы уменьшить сложность. Это также повышает эффективность приложения. Далее мы узнаем, как добиться абстракции в Python.
Классы абстракции в Python
Абстракция в Python может быть достигнута с помощью абстрактных классов и интерфейсов.
Класс, состоящий из одного или нескольких абстрактных методов, называется абстрактным классом. Абстрактные методы не содержат своей реализации. Абстрактный класс может быть унаследован подклассом, а абстрактный метод получает свое определение в подклассе. Классы абстракции должны быть прототипом другого класса. Абстрактный класс может быть полезен при разработке больших функций, а также для предоставления стандартного интерфейса для различных реализаций компонентов. Python предоставляет модуль abc для использования абстракции в программе Python. Рассмотрим следующий синтаксис.
from abc import ABC class ClassName(ABC):
Мы импортируем класс ABC из модуля abc.
Абстрактные базовые классы
Абстрактный базовый класс – это общая прикладная программа интерфейса для набора подклассов. Его может использовать сторонний поставщик, который предоставит такие реализации, как плагины. Это также полезно, когда мы работаем с большой базой кода, трудно запомнить все классы.
Работа абстрактных классов
В отличие от других языков высокого уровня, Python не предоставляет самого абстрактного класса. Нам нужно импортировать модуль abc, который обеспечивает основу для определения абстрактных базовых классов (ABC). ABC работает, декорируя методы базового класса как абстрактные. Он регистрирует конкретные классы как реализацию абстрактной базы. Мы используем @abstractmethod декоратор для определения абстрактного метода или, если мы не предоставляем определение методу, он автоматически становится абстрактным методом. Давайте разберемся в следующем примере.
# Python program demonstrate # abstract base class work from abc import ABC, abstractmethod class Car(ABC): def mileage(self): pass class Tesla(Car): def mileage(self): print("The mileage is 30kmph") class Suzuki(Car): def mileage(self): print("The mileage is 25kmph ") class Duster(Car): def mileage(self): print("The mileage is 24kmph ") class Renault(Car): def mileage(self): print("The mileage is 27kmph ") # Driver code t= Tesla () t.mileage() r = Renault() r.mileage() s = Suzuki() s.mileage() d = Duster() d.mileage()
The mileage is 30kmph The mileage is 27kmph The mileage is 25kmph The mileage is 24kmph
В приведенном выше коде мы импортировали модуль abc для создания абстрактного базового класса. Мы создали класс Car, который унаследовал класс ABC, и определили абстрактный метод с именем mileage(). Затем мы унаследовали базовый класс от трех разных подклассов и по-разному реализовали абстрактный метод. Мы создали объекты для вызова абстрактного метода.
Разберемся еще на одном примере.
# Python program to define # abstract class from abc import ABC class Polygon(ABC): # abstract method def sides(self): pass class Triangle(Polygon): def sides(self): print("Triangle has 3 sides") class Pentagon(Polygon): def sides(self): print("Pentagon has 5 sides") class Hexagon(Polygon): def sides(self): print("Hexagon has 6 sides") class square(Polygon): def sides(self): print("I have 4 sides") # Driver code t = Triangle() t.sides() s = square() s.sides() p = Pentagon() p.sides() k = Hexagon() K.sides()
Triangle has 3 sides Square has 4 sides Pentagon has 5 sides Hexagon has 6 sides
В приведенном выше коде мы определили абстрактный базовый класс с именем Polygon, а также определили абстрактный метод. Этот базовый класс наследуется различными подклассами. Мы реализовали абстрактный метод в каждом подклассе. Мы создали объект подклассов и вызываем метод side(). В игру вступают скрытые реализации метода side() внутри каждого подкласса. Абстрактный метод side(), определенный в абстрактном классе, никогда не вызывается.
Что следует помнить
Ниже приведены моменты, которые мы должны помнить об абстрактном базовом классе в Python:
- Абстрактный класс может содержать как обычный метод, так и абстрактный метод.
- Аннотация не может быть создана; мы не можем создавать объекты для абстрактного класса.
Абстракция необходима для сокрытия подробных функций от пользователей. Мы рассмотрели все основные концепции абстракции в Python.
Понимание абстракции в Python
В этом руководстве мы обсудим концепцию абстракции в Python для подхода объектно-ориентированного программирования.
По сути, Abstraction фокусируется на сокрытии внутренних реализаций процесса или метода от пользователя. Таким образом, пользователь знает, что он делает, но не знает, как выполняется работа.
Что такое абстракция в Python?
Например, люди не думают об автомобиле как о совокупности тысяч отдельных деталей. Вместо этого они видят в нем четко определенный объект со своим уникальным поведением. Эта абстракция позволяет людям управлять автомобилем, не зная о сложности деталей, из которых он состоит. Они могут игнорировать детали работы трансмиссии двигателя и тормозных систем. Вместо этого они могут использовать объект в целом.
Мощный способ управления абстракцией — использование иерархической классификации. Это позволяет нам наслоить семантику сложных систем, разбивая их на более управляемые части. Снаружи автомобиль представляет собой единый объект. Оказавшись внутри, вы видите, что автомобиль состоит из нескольких подсистем: рулевого управления, тормозов, аудиосистемы, ремней безопасности и т. д. В свою очередь, каждая из этих подсистем состоит из более мелких блоков.
Дело в том, что мы управляем автомобилем (или любой другой сложной системы) с помощью иерархических абстракций.
Это также может быть применено к компьютерным программам, использующим концепции ООП. В этом суть объектно-ориентированного программирования.
Абстрактные классы и методы в Python
Чтобы объявить абстрактный класс, нам сначала нужно импортировать модуль abc . Давайте посмотрим на пример.
from abc import ABC class abs_class(ABC): #abstract methods
Здесь abs_class — это абстрактный класс, внутри которого могут быть определены абстрактные методы или любые другие методы.
В качестве свойства абстрактные классы могут иметь любое количество абстрактных методов, сосуществующих с любым количеством других методов. Например, мы можем видеть ниже.
from abc import ABC, abstractmethod class abs_class(ABC): #normal method def method(self): #method definition @abstractmethod def Abs_method(self): #Abs_method definition
Здесь method() — обычный метод, тогда как Abs_method() — абстрактный метод, реализующий @abstractmethod из модуля abc.
Пример
Теперь, когда мы знаем об абстрактных классах и методах, давайте взглянем на пример.
from abc import ABC, abstractmethod class Absclass(ABC): def print(self,x): print("Passed value: ", x) @abstractmethod def task(self): print("We are inside Absclass task") class test_class(Absclass): def task(self): print("We are inside test_class task") class example_class(Absclass): def task(self): print("We are inside example_class task") #object of test_class created test_obj = test_class() test_obj.task() test_obj.print(100) #object of example_class created example_obj = example_class() example_obj.task() example_obj.print(200) print("test_obj is instance of Absclass? ", isinstance(test_obj, Absclass)) print("example_obj is instance of Absclass? ", isinstance(example_obj, Absclass))
Absclass — это абстрактный класс, наследуемый от класса ABC модуля abc. Он содержит абстрактный метод task() и метод print() которые видны пользователю. Два других класса, унаследованных от этого абстрактного класса, — это test_class и example_class . У обоих есть собственный метод task() (расширение абстрактного метода).
После того, как пользователь создает объекты из классов test_class и example_class и вызывает метод task() для обоих из них, в игру вступают скрытые определения методов task() внутри обоих классов. Эти определения скрыты от пользователя. Абстрактный метод task() из абстрактного класса Absclass фактически никогда не вызывается.
Но когда метод print() вызывается как для test_obj, так и для example_obj, вызывается метод print() Absclass, поскольку это не абстрактный метод.
Примечание: мы не можем создавать экземпляры абстрактного класса. Это вызывает Error .