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
Пример применения 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 | |
Полиморфизм |