Наследование позволяет классу (подклассу или дочернему классу) переиспользовать и расширять поля и методы другого класса (суперкласса или родительского класса). Оно моделирует отношение is-a: Dog .
Наследование позволяет классу (подклассу или дочернему классу) переиспользовать и расширять поля и методы другого класса (суперкласса или родительского класса). Оно моделирует отношение is-a: Dog .
Animalclass Animal:
def __init__(self, name):
self.name = name
def eat(self):
return f"{self.name} is eating"
class Dog(Animal): # Dog inherits everything from Animal
def bark(self): # ...and adds new behavior
return "Woof!"
d = Dog("Rex")
print(d.eat()) # "Rex is eating" → inherited, not rewritten
print(d.bark()) # "Woof!" → Dog-specific
Dog получила __init__ и eat бесплатно и добавила bark. Подкласс также может переопределить унаследованные методы для изменения поведения.
| Преимущество | Риск |
|---|---|
| Переиспользование общего кода | Тесная связь с родительским классом |
| Моделирование реальных иерархий | Хрупкий базовый класс — изменения в родителе нарушают дочерние классы |
| Полиморфизм через общий тип | Глубокие деревья становятся сложными для отслеживания |
Общее правило: отдавайте предпочтение композиции вместо наследования, когда отношение действительно "has-a", а не "is-a".
Наследование — наиболее неправильно используемая возможность ООП: соблазнительно использовать её только для совместного использования кода, что связывает несвязанные классы.
При правильном использовании — только для истинных отношений is-a — оно обеспечивает переиспользование плюс полиморфизм, позволяя вам единообразно обрабатывать множество подтипов через их общий родительский класс.