все Python 3ООПпонятие
Наследование
наследование
Дочерний класс наследует атрибуты и методы родительского. Переопределение методов — полиморфизм.
Синтаксис
class Child(Parent): ...
Самая частая ошибка — переопределить __init__ в потомке и забыть вызвать super().__init__(...): код родителя не отработает и его атрибуты просто не появятся. Наследование жёстко связывает классы; если нужна лишь чужая функциональность, композиция (хранить объект как поле) часто гибче, чем «класс-потомок ради переиспользования».
Примеры
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return '...'
class Dog(Animal):
def speak(self):
return 'Woof!'
class Cat(Animal):
def speak(self):
return 'Meow!'
for a in [Dog('Rex'), Cat('Whiskers')]:
print(a.name, a.speak()) # → Rex Woof! / Whiskers Meow!
print(isinstance(Dog('x'), Animal)) # → True
print(isinstance(Dog('x'), Cat)) # → False
print(issubclass(Dog, Animal)) # → True
# Дочерний класс добавляет атрибуты
class Vehicle:
def __init__(self, brand):
self.brand = brand
class Car(Vehicle):
def __init__(self, brand, doors):
super().__init__(brand)
self.doors = doors
c = Car('Toyota', 4)
print(c.brand, c.doors) # → Toyota 4
# Наследование встроенных классов
class MyList(list):
def total(self):
return sum(self)
ml = MyList([1, 2, 3, 4])
print(ml.total()) # → 10
print(ml[0]) # → 1 — всё поведение list сохранилось
# Поиск метода идёт по MRO
class A:
def hello(self):
return 'A'
class B(A):
pass
class C(B):
pass
print(C().hello()) # → A
print([k.__name__ for k in C.__mro__]) # → ['C', 'B', 'A', 'object']
# Переопределение с вызовом родителя
class Employee:
def __init__(self, name, salary):
self.name = name
self.salary = salary
def describe(self):
return f'{self.name}: {self.salary}'
class Manager(Employee):
def __init__(self, name, salary, dept):
super().__init__(name, salary)
self.dept = dept
def describe(self):
return super().describe() + f' [{self.dept}]'
print(Manager('Alice', 80000, 'IT').describe()) # → Alice: 80000 [IT]
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности