Python наследование классов ооп
- Python — Обзор
- Основы синтаксиса Python
- Операторы в Python
- Типы данных в Python
- Условные конструкторы в Python
- Циклы в Python
- Функции в Python
- Функциональное программирование в Python
- ООП в Python
- Модули в Python
- Работа с файлами в Python
- Обработка исключительных ситуаций в Python
Одним из четырех принципов ООП является наследование (вместе с абстракцией, инкапсуляцией, полиморфизмом).
При создании нового объекта (класса), как в программировании, так и в реальной жизни, мы можем использовать 2 подхода:
- Создать экземпляр с нуля.
- Использовать уже существующий объект и обработать напильником довести до нужного нам состояния.
Безусловно, второй метод намного эффективнее, проще и требует меньших усилий. Легче вывести новую породу котов скрестив существующие породы, чем пытаться создать животное с нуля.
Возьмем более практический пример. Представим, что перед нами стоит задача запрограммировать класс дерева. Наше дерево имеет следующие атрибуты: вид, возраст и высоту. Так же дерево обладает способностью расти (при этом будет увеличиваться его высота и возраст) и способностью выводить информацию о себе.
class Tree(object): def __init__(self, kind, height): self.kind = kind self.age = 0 self.height = height def info(self): """ Метод вывода информации о дереве """ print ("<> years old <>. <> meters high.".format(self.age, self.kind, self.height)) def grow(self): """ Метод роста """ self.age += 1 self.height += 0.5
Для проверки создадим экземпляр класса дерево и немного поиграем с ним.
tree_1 = Tree("oak", 0.5) tree_1.info() tree_1.grow() tree_1.info()
Теперь представим, что наша задача усложняется: нам необходимо добавить класс фруктового дерева, у которого будут те же атрибуты и методы, но в дополнение появится метод сбора урожая фруктов. Конечно, мы можем создать с нуля класс FruitTree и переписать наново весь код, который будет практически идентичен тому что мы уже написали, но это будет неэффективно, кроме того, нарушается принцип DRY (Don’t Repeat Yourself). Вместо этого мы можем воспользоваться наследованием, то есть создать класс FruitTree и указать ему в качестве родителя класс Tree. Таким образом, FruitTree получит доступ ко всем атрибутам и методам, которыми обладает класс Tree.
Как указать родительский класс в Python.
Родительский класс помещается в скобки после имени класса.
Таким образом, наш код для класса фруктового дерева будет следующим:
class FruitTree(Tree): def __init__(self, kind, height): # Необходимо вызвать метод инициализации родителя. # В Python 3.x это делается при помощи функции super() super().__init__(kind, height) def give_fruits(self): print ("Collected 20kg of <>s".format(self.kind))
Создадим экземпляр класса FruitTree:
tree_2 = FruitTree("apple", 0.7) # у нас есть доступ к методам родителя tree_2.info() tree_2.grow() # Мы можем использовать свой метод tree_2.give_fruits() # А для родительского экземпляра метод give_fruits() недоступен tree_1.give_fruits() # Вызовет ошибку
Зачем использовать наследование.
Концепция наследования в программировании позволяет сократить время разработки, упростить процесс написания программы как сейчас, так и в будущем, когда заказчик захочет внести «небольшие правки» в проект. Правильно спроектированный класс это, кроме прочего, гибкая структура, которую вы свободно сможете изменять, дополнять в будущем. Важно помнить, что иногда проще создать дополнительный базовый класс, наследовать от него и расширять по мере необходимости, чем сразу написать готовый класс.
Наследование в Python
В мире объектно-ориентированного программирования (ООП) наследование относится к механизму способности класса наследовать или расширять свойства другого класса в процессе выполнения. Это свойство позволяет производному классу получать свойства или черты базового класса.
Наследование в Python считается одним из наиболее важных аспектов ООП, поскольку оно служит функции повторного использования, что делает часть кода более надежной.
Преимущества
- Наследование описывает отношения, которые напоминают сценарии реального мира.
- Он предоставляет возможность повторного использования, которая позволяет пользователю добавлять дополнительные функции в производный класс, не изменяя его.
- Если класс Y наследуется от класса X, то автоматически все подклассы Y будут наследовать от класса X.
Основные термины наследования
- Подкласс/производный класс: это класс, который наследует свойства от другого класса (обычно базового класса).
- Суперкласс/базовый класс: это класс, из которого происходят другие подклассы.
- Производный класс обычно выводит/наследует/расширяет базовый класс.
Синтаксис
class SuperClassName: Body of Super class class DerivedClass_Name(SuperClass): Body of derived class
Примеры
Давайте погрузимся в мир наследования в Python на простых примерах. Читайте также про множественное наследование.
Шаг 1. Создайте базовый класс
class Father: # The keyword 'self' is used to represent the instance of a class. # By using the "self" keyword we access the attributes and methods of the class in python. # The method "__init__" is called as a constructor in object oriented terminology. # This method is called when an object is created from a class. # it allows the class to initialize the attributes of the class. def __init__(self, name, lastname): self.name = name self.lastname = lastname def printname(self): print(self.name, self.lastname) # Use the Father class to create an object, and then execute the printname method: x = Father("Anees", "Mulani") x.printname()
Шаг 2. Создайте производный класс
# The subclass __init__() function overrides the inheritance of the base class __init__() function. class Son(Father): def __init__(self, name, lastname): Father.__init__(self, name, lastname) x = Son("Dev", "Bajaj") x.printname()
Использование функции super()
Используя функцию super() , вам не нужно использовать имя родительского элемента, он автоматически наследует методы и свойства от своего родительского элемента.
class Father: def __init__(self, name, lastname): self.name = name self.lastname = lastname def printname(self): print(self.name, self.lastname) class Son(Father): def __init__(self, name, lastname): super().__init__(name, lastname) x = Student("Dev", "Bajaj") x.printname()