Курс Python → Отношения подклассов в Python

Отношения подклассов в Python могут быть не такими простыми, как кажется на первый взгляд. В языке Python отношения подклассов не всегда являются транзитивными, что означает, что если класс А наследует класс В, а класс В наследует класс С, то класс А не обязательно будет наследовать класс С.

В Python у каждого класса есть возможность определить свой собственный метод subclasscheck, который определяет, является ли данный класс подклассом другого класса. Например, при вызове функции issubclass(cls, Hashable) Python просто проверяет, есть ли у класса cls метод «hash» или он унаследован от другого класса.

Однако, иногда это может привести к неожиданным результатам. Например, класс object в Python является хешируемым (hashable), но класс list уже нет. Таким образом, при вызове issubclass(list, Hashable) результат будет False, что нарушает транзитивность отношений подклассов.


class Hashable:
    def __hash__(self):
        return hash(self)

class CustomList(Hashable):
    pass

print(issubclass(CustomList, Hashable))  # Output: True

class MyList(list):
    pass

print(issubclass(MyList, Hashable))  # Output: False

В приведенном выше примере мы определили класс Hashable с методом __hash__, который делает объекты этого класса хешируемыми. Затем мы создали класс CustomList, который наследуется от Hashable, и класс MyList, который наследуется от стандартного класса list. Как видно из результатов, CustomList является подклассом Hashable, в то время как MyList не является хешируемым.

Твои коллеги будут рады, поделись в

Автор урока

Дмитрий Комаровский
Дмитрий Комаровский

Автоматизация процессов
в КраснодарБанки.ру

Другие уроки курса "Python"

  1. Beautiful Soup — извлечение данных из HTML
  2. Инверсия списка и строки в Python
  3. Оптимизация поиска в словарях
  4. Функция count() в Python
  5. Создание и инициализация объектов
  6. Использование функции enumerate()
  7. Исключение NotImplementedError
  8. Переворот строки с помощью срезов
  9. Python Метод del.
  10. Модуль os в Python: работа с файлами
  11. Аннотации типов в Python
  12. Создание лямбда-функций
  13. Сортировка с помощью параметра key
  14. Управление фоновыми задачами в Python
  15. Использование подчеркивания в REPL
  16. Тип данных TypeVarTuple
  17. Отрицательные индексы списков в Python
  18. Блок else в Python
  19. Документирование функций в Python
  20. Работа с файлами в Python
  21. Транспонирование матрицы в Python
  22. Операции с кортежами
  23. Получение текущего времени в Python
  24. Проверка переменных окружения в Python
  25. Просмотр атрибутов и методов класса
  26. Преобразование числа в список цифр
  27. Лямбда-функции в defaultdict
  28. Перемещение и удаление файлов в Python
  29. Python: возвращение нескольких значений
  30. Метод split() для разделения строк
  31. GitHub в Telegram: подписка на уведомления
  32. Рекурсия для обращения строки
  33. Анонимные функции Lambda
  34. Функция с *args.
  35. Обмен значений переменных в Python
  36. Python UserString — создание подклассов строк
  37. Объединение списков в строку
  38. Фильтрация списка от «ложных» значений
  39. Поиск самого длинного слова в списке с использованием max()
  40. Howdoi — получение ответов из терминала
  41. Логические операторы в Python
  42. Подсчет элементов в списке с Counter
  43. Генераторы данных
  44. Именованные срезы в Python
  45. Обмен данными с asyncio.Queue
  46. Сортировка с помощью key
  47. Создание детектора плагиата

Marketello читают маркетологи из крутых компаний