- Интерфейс в Python — это набор сигнатур методов, которые должны быть предоставлены реализующим классом.
- Интерфейс содержит методы, которые являются абстрактными по своей природе. Абстрактные методы будут иметь единственное объявление, поскольку реализации нет.
- Интерфейс в Python определяется с использованием класса Python и является подклассом интерфейса. Интерфейс, который является родительским интерфейсом для всех интерфейсов.
- Реализации будут выполняться классами, которые унаследуют интерфейс. Интерфейсы Python немного отличаются от интерфейсов других языков, таких как Java, C# или C++.
- Реализация интерфейса — это способ написания организованного кода.
Давайте разберемся с интерфейсами Python на нескольких примерах.
- Как объявить интерфейс
- Как создать интерфейс
- Неформальный интерфейс
- Формальный интерфейс
- Примеры
- Несколько интерфейсов
- Разница между абстрактным классом и интерфейсом
Как объявить интерфейс
Здесь мы увидим, как объявить интерфейсный модуль в Python.
Синтаксис:
класс MyInterface(zope.interface.Interface)
- Сначала мы импортируем модуль zope.interface.
- zope.interface — это модуль, который используется для реализации объектного интерфейса в Python.
- Библиотека zope.interface — способ выйти из ситуации, когда что-то неясно.
- Интерфейс действует как образец для проектирования классов. Здесь @zope.interface.implementer (Lunch) реализован с использованием декоратора-реализатора в классе.
- Этот пакет напрямую экспортирует атрибуты и интерфейсы.
- Для преодоления неопределенности интерфейса реализован модуль zope.
Реализация (класс) — эта функция возвращает логическое значение. Если класс реализует интерфейс, результатом будет True, иначе False.
Пример:
импортировать zope.interface класс Lunch(zope.interface.Interface): Northindian = zope.interface.Attribute("шоколад") def food(собственный, североиндийский): проходить def colddrinks(сам, напитки): проходить @zope.interface.implementer(Обед) класс Lunch(zope.interface.Interface): def food(собственный, североиндийский): вернуться в Северную Индию def colddrinks(self,beverages): возврат напитков colddrinks = Обед['colddrinks'] еда = Обед['еда'] print(Lunch.implementedBy(Lunch)) print(type(холодные напитки)) печать(тип(еда))
Здесь мы видим, что класс реализован в виде интерфейса. Возвращается логическое значение true. Также мы можем заметить, что функция вызывается дважды, поскольку в классе определены две функции: def food и def colddrinks.
На изображении ниже показан результат:
Как создать интерфейс
Существует два способа создания и реализации интерфейса в Python:
- Неформальный интерфейс.
- Формальный интерфейс.
Неформальный интерфейс
В Python неформальный интерфейс представляет собой класс. Этот класс определяет методы, которые можно переопределить, но без обязательного применения. Такой интерфейс в Python называют протоколом, потому что он не является строгим и не может быть реализован формально.
Часто используемые методы, которые применяются для выполнения определённых операций:
- __iter__ — этот метод возвращает итератор для объекта.
- __len__ — этот метод возвращает длину строки, списка, словаря или кортежа.
- __contain__ — этот метод используется для проверки того, содержит ли он другую строку.
Пример:
class Chocolate: def __init__(self, items): self.__items = items def __len__(self): return len(self.__items) def __contains__(self, items): return items in self.__items fav_chocolate = Chocolate(["kitkat", "diarymilk", "munch","5star"]) print(len(fav_chocolate)) print("kitkat" in fav_chocolate) print("munch" not in fav_chocolate) print("dirymilk" not in fav_chocolate) print("5star" in fav_chocolate)
- В этом примере я реализовал __len__ и __contain__. Мы можем напрямую использовать функцию len() для экземпляра шоколада, а затем нам нужно проверить наличие элемента в списке.
- Используя оператор in, print (len(fav_chocolate)) используется для определения длины списка.
- Здесь мы видим, что он возвращает логическое значение. Если элемент присутствует в списке, он вернет true, в противном случае — false. На скриншоте ниже показан результат:
Формальный интерфейс
Здесь мы видим формальный интерфейс Python:
- Формальный интерфейс в Python — это интерфейс, который применяется формально. Для создания формального интерфейса нам нужно использовать ABC (абстрактные базовые классы).
- Азбука объясняется, когда мы определяем класс, который является абстрактным по своей природе, мы также определяем методы базового класса как абстрактные методы.
- Любой объект, который мы получаем из базовых классов, вынужден реализовывать эти методы.
- В этом примере я импортировал модуль abc и определил класс Food. @abc.abstractmethod — это декоратор, указывающий абстрактные методы. Он используется для объявления абстрактных методов для свойств.
- Я определил вкус функции def, используя ключевое слово def. Используя ключевое слово self, мы можем получить доступ к атрибутам и методам класса.
- И я также определил подкласс как класс North_indian, а затем распечатал экземпляр из класса Food. Оператор pass используется в качестве заполнителя.
Пример:
import abc class Food(abc.ABC): @abc.abstractmethod def taste( self ): pass class north_indian(Food) : def taste(self): print(" Cooking! ") s = north_indian() print( isinstance(s, Food))
На скриншоте ниже показан результат:
В этом выводе мы можем увидеть логическое значение. Оно будет равно true, только если экземпляр класса существует, иначе будет false.
Примеры
Здесь мы увидим, как производный класс определяет абстрактный метод. Для этого мы импортировали модуль abc и создали класс myinterface, который наследуется от класса ABC из этого модуля.
Пример:
import abc class myinterface(abc.ABC): @abc.abstractclassmethod def display(): pass print("This is Myclass") class Myclass(myinterface): def display(): pass obj=Myclass()
Здесь создаётся объект obj класса Myclass, который выводит на экран текст «Это Myclass». Ниже вы можете увидеть примеры интерфейса Python.
Несколько интерфейсов
Теперь мы можем видеть несколько интерфейсов в Python.
В приведённом ниже примере нам необходимо импортировать модуль abc. После этого мы можем инициализировать класс Food и его подклассы NorthIndian() и SouthIndian().
Пример:
import abc class Food(abc.ABC): @abc.abstractmethod def taste( self ): pass class northIndian(Food) : def taste(self): print(" Cooking! ") class Food(abc.ABC): @abc.abstractmethod def taste(self): pass class southIndian(Food) : def taste(self) : print(" Cooking!.. ") a = northIndian() s = southIndian() print( isinstance(s, northIndian)) print( isinstance(s, southIndian)) print( isinstance(a, northIndian)) print( isinstance(a, southIndian))
Здесь мы видим в выводе значение false, так как экземпляр s был присвоен SouthIndian, но в операторе печати ему было присвоено значение NorthIndian. Чтобы убедиться в этом, вы можете обратиться к скриншотам ниже.
Разница между абстрактным классом и интерфейсом
Давайте поймем разницу между абстрактным классом и интерфейсом в Python.
Интерфейс Python | Абстрактный класс Python |
Интерфейс — это набор методов и атрибутов этого объекта. | Мы можем использовать абстрактный базовый класс для определения и реализации интерфейса. |
Все методы интерфейса абстрактны. | Абстрактный класс может иметь как абстрактные, так и конкретные методы. |
Мы используем интерфейс, если все функции необходимо реализовать по-разному для разных объектов. | Абстрактные классы используются, когда есть какая-то общая черта, общая для всех объектов как таковых. |
Интерфейс медленный по сравнению с абстрактным классом. | Абстрактные классы работают быстрее. |