English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Наследование позволяет нам определить класс, который наследует все функции родительского класса и позволяет добавлять дополнительные функции. В этой статье вы узнаете, как использовать наследование в Python.
Наследование — это мощная функция面向 объектного программирования.
Это означает определение новогокласс, при этом изменения в существующий класс минимальны или отсутствуют. Новый класс называетсядеривированным (или дочерним) классом, а новый класс, наследующий от него, называетсяБазовый (или родительский) класс.
class BaseClass: # Основной код базового класса class DerivedClass(BaseClass): # Основной код производного класса
Деривированные классы наследуют элементы от базового класса и добавляют новые элементы. Это可以提高 повторное использование кода.
Чтобы продемонстрировать использование наследования, давайте рассмотрим пример.
Многоугольник — это замкнутая фигура с тремя или более сторонами. Например, у нас есть класс под названием Polygon, который определен следующим образом.
class Polygon: def __init__(self, no_of_sides): self.n = no_of_sides self.sides = [0 for i in range(no_of_sides)] def inputSides(self): self.sides = [float(input("Ввести размер сторон "+str(i+1)+" : ")) for i in range(self.n)] def dispSides(self): for i in range(self.n): print("Размер сторон", i+1, "является", self.sides[i])
Этот класс имеет данные атрибуты, используемые для хранения количества сторон, сторонЧислои размер каждой стороны в виде списка, то естьКоличество сторон.
Метод inputSides() принимает размер каждой стороны, подобно тому, как dispSides() правильно показывает их.
Треугольник является многоугольником с тремя сторонами. Таким образом, мы можем создать класс, называемый Triangle, который наследуется от Polygon. Это позволяет легко использовать все доступные свойства в Polygon через Triangle. Мы не нуждаемся в повторном определении их (повторное использование кода). Класс Triangle определен следующим образом.
class Triangle(Polygon): def __init__(self): Polygon.__init__(self, 3) def findArea(self): a, b, c = self.sides # Вычислить полуокружность s = (a + b + c) / 2 area = (s*(s-a)*(s-b)*(s-c)) ** 0.5 print('Площадь треугольника составляет %0.2f' %area)
Однако, класс Triangle имеет новый метод findArea(), который находит и выводит площадь треугольника. Это пример выполнения.
>>> t = Triangle() >>> t.inputSides() Ввести размер сторон 1: 3 Ввести размер сторон 2: 5 Ввести размер сторон 3: 4 >>> t.dispSides() Сторонний размер 1 равен 3.0 Сторонний размер 2 равен 5.0 Сторонний размер 3 равен 4.0 >>> t.findArea() Площадь треугольника составляет 6.00
Мы можем видеть, что,尽管我们没有为类Triangle定义inputSides()或sides()之类的函数,但我们仍然可以使用它们。
Если атрибут не найден в классе, поиск продолжается до базового класса. Если базовый класс himself является производным от другого класса, то операция повторяется рекурсивно.
В примере, приведенном выше, обратите внимание, что в классах Triangle и Polygon определены методы __init__(). В таких случаях метод производного класса будет перекрывать метод базового класса. То есть, __init__() в Triangle имеет приоритет перед __init__() в Polygon.
Обычно, когда мы расширяем базовые методы, мы предпочитаем расширять их определение, а не просто заменять. Это достигается вызовом методов базового класса из производного класса (вызов Polygon.__init__() из __init__() в Triangle).
Лучшим выбором является использование встроенной функции super(). Таким образом, super().__init__(3) эквивалентно Polygon.__init__(self, 3) и является предпочтительным. Вы можете узнать больше оВ PythonФункция super()Более подробная информация.
Два встроенных функции isinstance() и issubclass() используются для проверки наследования. Если объект является примером класса или другого класса, происходящего от него, функция isinstance() возвращает True. Каждый класс в Python наследуется от базового класса object.
>>> isinstance(t, Triangle) True >>> isinstance(t, Polygon) True >>> isinstance(t, int) False >>> isinstance(t, object) True
Таким образом, issubclass() используется для проверки наследования классов.
>>> issubclass(Polygon, Triangle) False >>> issubclass(Triangle, Polygon) True >>> issubclass(bool, int) True