💀
Второй курс РПО
Разработка программных модулей
Разработка программных модулей
  • Модели разработки
  • Ошибки и отладка программ
  • Средства разработки алгоритмов
    • Основные принципы и стадии тестирования
  • Сложностные классы
  • Эмуляторы операционных систем
  • Сложность сортировки
  • Уровни тестирования
  • Задание №1
  • Регрессионное тестирование
  • Тестирование «белым ящиком»
  • Как делать оценку сложности?
  • Алгоритмы и сложность
  • Тестирование "белым ящиком" №2
  • Сложность алгоритмов
  • Тестирование "белым ящиком" №3
  • Тестирование "Чёрным ящиком»" №1
  • Тестирование "Черным ящиком" №2
  • Оценка сложности эвристических алгоритмов
  • Принципы ООП
  • Тестирование "Черным ящиком" №3
  • КТ - В3
  • Модульное тестирование
    • С кодами
  • Модульное тестирование
  • Абстрактные классы и интерфейсы в Python
  • Структуры в Python по аналогии с C++
    • Диалоги гениев
  • Делегаты в Python
    • Ещё более не смешные диалоги
  • Регулярные выражения в Python от простого к сложному
  • Python: Коллекции
  • Параметризованные классы (шаблоны)
  • Указатели и операции со списками в Python
  • Интеграционное тестирование
  • Работа с классами. Перегрузка методов
  • Определение операций в классе.
  • Создание наследованных классов
  • Интеграционное тестирование
  • Работа с объектами через интерфейсы
  • Использование стандартных интерфейсов
  • Работа с типом данных "Структура"
  • Коллекции. Параметризованные классы
  • Использование регулярных выражений
  • Операции со списками
  • Что такое паттерны проектирования?
  • Шпаргалка по шаблонам проектирования
    • [Habr] Шпаргалка
  • UML-диаграммы проектирования
  • Использование основных шаблонов.
  • Использование каких то там шаблонов
  • 15-я Практическая
  • 16-я Практическая
  • Graphviz Online
  • 17-я Практическая
  • Введение в теорию программирования: Объектно-ориентированный подход
  • Документирование софта и стандарты
  • C# Ввод и вывод
  • Оптимизация кода: просто о главном
  • Автоматизация разработки технической документации
  • Автоматизированное документирование и первичные данные
  • ADO.NET что это?
Powered by GitBook
On this page
  • Абстрактные базовые классы (АБК)
  • Интерфейсы (zope.interfaces)
  • Адаптеры
  • Сравнение АБК и интерфейсов
  • Выводы

Абстрактные классы и интерфейсы в Python

15.01.2025

Абстрактные классы и интерфейсы — это инструменты для документирования кода и ограничения взаимодействия между абстракциями (классами). Они упрощают проектирование крупных ООП-систем.

Абстрактные базовые классы (АБК)

Абстрактные базовые классы были добавлены в Python с версии 2.6 в модуле abc. Назначение: задавать обязательные методы и свойства для классов-наследников.

Пример использования:

from abc import ABCMeta, abstractmethod, abstractproperty

class Movable(metaclass=ABCMeta):
    @abstractmethod
    def move(self):
        """Переместить объект"""

    @abstractproperty
    def speed(self):
        """Скорость объекта"""
        
class Car(Movable):
    def __init__(self):
        self._speed = 10
        self.position = 0

    def move(self):
        self.position += self._speed

    @property
    def speed(self):
        return self._speed

Ключевые моменты:

  1. АБК проверяются через isinstance и issubclass.

  2. Используются для построения иерархий классов.

  3. Применяются в стандартных модулях, например, collections.

Подробности:


Интерфейсы (zope.interfaces)

Назначение: декларативно определять, какие методы и атрибуты должны быть у объекта. Интерфейсы появились в проекте Zope3 для реализации компонентной архитектуры.

Пример использования:

import zope.interface

class IVehicle(zope.interface.Interface):
    speed = zope.interface.Attribute("Скорость")
    def move():
        """Сделать шаг"""

class Car:
    zope.interface.implements(IVehicle)

    def __init__(self):
        self.speed = 1
        self.position = 0

    def move(self):
        self.position += self.speed

Ключевые моменты:

  1. Интерфейсы используются декларативно: класс реализует (implements), объект предоставляет (provides).

  2. Проверки через implementedBy и providedBy.


Адаптеры

Назначение: адаптировать классы к необходимым интерфейсам. Используются для связывания компонентов.

Пример использования:

import zope.interface
from zope.component import adapts, getGlobalSiteManager

class IDesk(zope.interface.Interface):
    def register():
        """Регистрация гостя"""

class IGuest(zope.interface.Interface):
    name = zope.interface.Attribute("Имя гостя")

class Guest:
    zope.interface.implements(IGuest)

    def __init__(self, name):
        self.name = name

class GuestToDeskAdapter:
    adapts(IGuest)
    zope.interface.implements(IDesk)

    def __init__(self, guest):
        self.guest = guest

    def register(self):
        print(f"{self.guest.name} зарегистрирован")

Регистрация адаптера:

guest = Guest("Иван")
gsm = getGlobalSiteManager()
gsm.registerAdapter(GuestToDeskAdapter)

adapter = IDesk(guest, alternate=None)
if adapter:
    adapter.register()

Сравнение АБК и интерфейсов

Абстрактные классы
Интерфейсы

Задают жесткие ограничения

Декларативная сущность

Проверка через isinstance

Проверка через providedBy

Строят иерархию наследования

Подходят для компонентной архитектуры

Удобны для миксинов

Легко адаптируются


Выводы

  1. АБК:

    • Используются для строгого определения структуры классов.

    • Применимы для создания фреймворков и сложных библиотек.

  2. Интерфейсы:

    • Подходят для гибкой архитектуры с адаптерами.

    • Часто используются в крупных проектах (Zope, Twisted).

Использовать АБК или интерфейсы только в крупных проектах, чтобы избежать лишней сложности в коде.

PreviousМодульное тестированиеNextСтруктуры в Python по аналогии с C++

Last updated 4 months ago

Подробнее об АБК в .

PEP 3119