super()

Содержание
Введение
Пример кода без наследования
Пример кода без super()
Пример применения super()
Пример с classvariable
Похожие статьи

Введение

Пример создания классов без наследования

class Rectangle: def __init__(self, length, width): self.length = length self.width = width def area(self): return self.length * self.width def perimeter(self): return 2 * self.length + 2 * self.width class Square: def __init__(self, length): self.length = length def area(self): return self.length * self.length def perimeter(self): return 4 * self.length square = Square(4) print(square.area()) rectangle = Rectangle(2,4) print(rectangle.area())

16 8

Пример наследования без super()

Напомним как будет выглядеть наследование без применения super()

class Square(Rectangle): def __init__(self, length): Rectangle.__init__(self, length, length) square = Square(4) print(square.area()) rectangle = Rectangle(2,4) print(rectangle.area())

16 8

РЕКЛАМА хостинга Beget, которым я пользуюсь более десяти лет

Изображение баннера

Конец рекламы хостинга Beget, который я всем рекомендую.

Пример применения super()

Гораздо короче можно инициализировать класс Square опираясь на уже существующий класс Rectangle

# Создадим класс Square который будет наследовать от класса Rectangle class Square(Rectangle): def __init__(self, length): super().__init__(length, length)

В этом примере super() использовался без явного указания аргументов. По умолчанию передаётся два аргумента - название класса и self.

class Rectangle: def __init__(self, length, width): self.length = length self.width = width def area(self): return self.length * self.width def perimeter(self): return 2 * self.length + 2 * self.width # Создадим класс Square который будет наследовать от класса Rectangle class Square(Rectangle): def __init__(self, length): super(Square, self).__init__(length, length) square = Square(4) print(square.area()) rectangle = Rectangle(2, 4) print(rectangle.area())

Пример с classvarible

Возможно цель применения super() станет понятнее на этом примере с classvariable

Предположим, что к предыдущему примеру мы хотим добавить следующий функционал: все созданные прямоугольники добавляются в список, все созданные квадраты добавляются как в список прямоугольников так и в отдельный список квадратов.

Про __future__ можно прочитать здесь , про Type Annotations - здесь

from __future__ import annotations class Rectangle: all_rectangles: list[Rectangle] = [] all_squares: list[Rectangle] = [] def __init__(self, length: float, width: float) -> None: self.length = length self.width = width Rectangle.all_rectangles.append(self) def area(self) -> float: return self.length * self.width def perimeter(self) -> float: return 2 * self.length + 2 * self.width class Square(Rectangle): def __init__(self, length: float) -> None: super(Square, self).__init__(length, length) Rectangle.all_squares.append(self) print(f"Square with side {length} created") r1 = Rectangle(3, 2) r2 = Rectangle(4, 7) s = Square(5) print(Rectangle.all_rectangles) print(Rectangle.all_squares)

Square with side 5 created [<__main__.Rectangle object at 0x000001F6A58A54C0>, <__main__.Rectangle object at 0x000001F6A58A54F0>, <__main__.Square object at 0x000001F6A58A5550>] [<__main__.Square object at 0x000001F6A58A5550>]

Видно, что сохранено три прямоугольника и один квадрат.

Класс Square при инициализации сперва использует родительский __init__() от Rectangle. Добавляет квадрат в all_rectangles. Затем уже от себя добавляет квадрат в all_squares и печатает сообщение.

Если бы в __init__() не было super() квадраты не попадали бы в all_rectangles

class Square(Rectangle): def __init__(self, length: float) -> None: Rectangle.all_squares.append(self) print(f"Square with side {length} created") r1 = Rectangle(3, 2) r2 = Rectangle(4, 7) s1 = Square(2) s2 = Square(3) s2 = Square(4) print(Rectangle.all_rectangles) print(Rectangle.all_squares) print(f"Rectangle count: {len(Rectangle.all_rectangles)}") print(f"Square count: {len(Rectangle.all_squares)}")

Square with side 2 created Square with side 3 created Square with side 4 created [<__main__.Rectangle object at 0x00000222640B4FB0>, <__main__.Rectangle object at 0x00000222640B55E0>] [<__main__.Square object at 0x00000222640B5640>, <__main__.Square object at 0x00000222640B56A0>, <__main__.Square object at 0x00000222640B56D0>] Rectangle count: 2 Square count: 3

Создано два прямоугольника и три квадрата. Ни один из трёх квадратов не попал в all_rectangles

Автор статьи: Андрей Олегович

Похожие статьи
ООП в Python
Классы
Методы
class variables
class methods
Статические методы
Наследование
super()
Специальные методы
dataclass
__slots__
Декоратор property
Полиморфизм

РЕКЛАМА хостинга Beget, которым я пользуюсь более десяти лет

Изображение баннера

Конец рекламы хостинга Beget, который я всем рекомендую.

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: