⚡ Краткий справочник
class Child(Parent): — наследование.
def method(self): ... — переопределение метода родителя.
super().__init__(...) — вызов родительского конструктора.
super().method() — вызов родительского метода.
isinstance(obj, Class) — объект является экземпляром Class или его наследника.
issubclass(A, B) — A наследуется от B.
Общий синтаксис наследования
class Parent:
def __init__(self, value: int) -> None:
self.value = value
def show(self) -> None:
print(self.value)
class Child(Parent):
def __init__(self, value: int, extra: str) -> None:
super().__init__(value)
self.extra = extra
def show(self) -> None:
super().show()
print(self.extra)
Таблицы
Наследование и переопределение
| Конструкция | Описание | Пример |
class Child(Parent): | Дочерний класс наследует Parent | class Programmer(Employee): |
| Переопределение метода | Метод с тем же именем в дочернем классе заменяет родительский | def work(self): ... |
super().method() | Вызов метода ближайшего родителя | super().work() |
super()
| Запись | Когда используется |
super().__init__(...) | Чтобы не дублировать инициализацию родителя |
super().method() | Чтобы расширить, а не полностью заменить метод родителя |
| В цепочке наследования | super() находит ближайшего родителя автоматически |
isinstance и issubclass
| Функция | Синтаксис | Результат True, если... |
isinstance | isinstance(obj, Class) | obj — экземпляр Class или его наследника |
isinstance | isinstance(obj, (A, B)) | obj принадлежит одному из классов кортежа |
issubclass | issubclass(A, B) | A напрямую или через цепочку наследуется от B |
issubclass | issubclass(A, (B, C)) | A наследуется от любого класса кортежа |
type() против isinstance()
| Запись | Учитывает наследование | Когда использовать |
type(obj) is Class | Нет | Почти никогда; подходит только для проверки точного типа |
isinstance(obj, Class) | Да | Всегда, когда важна иерархия классов |
Частые шаблоны
Полиморфная обработка списка объектов
def process_staff(staff: list[Employee]) -> None:
for person in staff:
person.work() # вызовется нужная версия метода
Защита от некорректного класса
def hire(cls: type):
if not issubclass(cls, Employee):
raise ValueError("Можно нанимать только наследников Employee")
person = cls()
person.work()