Как наследовать класс python

Как наследовать класс python

  • Python — Обзор
  • Основы синтаксиса Python
  • Операторы в Python
  • Типы данных в Python
  • Условные конструкторы в Python
  • Циклы в Python
  • Функции в Python
  • Функциональное программирование в Python
  • ООП в Python
  • Модули в Python
  • Работа с файлами в Python
  • Обработка исключительных ситуаций в Python

Одним из четырех принципов ООП является наследование (вместе с абстракцией, инкапсуляцией, полиморфизмом).

При создании нового объекта (класса), как в программировании, так и в реальной жизни, мы можем использовать 2 подхода:

  1. Создать экземпляр с нуля.
  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()

наследование в python, python inheritance

Теперь представим, что наша задача усложняется: нам необходимо добавить класс фруктового дерева, у которого будут те же атрибуты и методы, но в дополнение появится метод сбора урожая фруктов. Конечно, мы можем создать с нуля класс FruitTree и переписать наново весь код, который будет практически идентичен тому что мы уже написали, но это будет неэффективно, кроме того, нарушается принцип DRY (Don’t Repeat Yourself). Вместо этого мы можем воспользоваться наследованием, то есть создать класс FruitTree и указать ему в качестве родителя класс Tree. Таким образом, FruitTree получит доступ ко всем атрибутам и методам, которыми обладает класс Tree.

Читайте также:  Plt to pdf python

Как указать родительский класс в 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, python inheritance

Зачем использовать наследование.

Концепция наследования в программировании позволяет сократить время разработки, упростить процесс написания программы как сейчас, так и в будущем, когда заказчик захочет внести «небольшие правки» в проект. Правильно спроектированный класс это, кроме прочего, гибкая структура, которую вы свободно сможете изменять, дополнять в будущем. Важно помнить, что иногда проще создать дополнительный базовый класс, наследовать от него и расширять по мере необходимости, чем сразу написать готовый класс.

Источник

Как наследовать класс python

Наследование позволяет создавать новый класс на основе уже существующего класса. Наряду с инкапсуляцией наследование является одним из краеугольных камней объектно-ориентированного программирования.

Ключевыми понятиями наследования являются подкласс и суперкласс . Подкласс наследует от суперкласса все публичные атрибуты и методы. Суперкласс еще называется базовым (base class) или родительским (parent class), а подкласс — производным (derived class) или дочерним (child class).

Синтаксис для наследования классов выглядит следующим образом:

class подкласс (суперкласс): методы_подкласса

Например, у нас есть класс Person, который представляет человека:

class Person: def __init__(self, name): self.__name = name # имя человека @property def name(self): return self.__name def display_info(self): print(f"Name: ")

Предположим, нам необходим класс работника, который работает на некотором предприятии. Мы могли бы создать с нуля новый класс, к примеру, класс Employee:

class Employee: def __init__(self, name): self.__name = name # имя работника @property def name(self): return self.__name def display_info(self): print(f"Name: ") def work(self): print(f" works")

Однако класс Employee может иметь те же атрибуты и методы, что и класс Person, так как работник — это человек. Так, в выше в классе Employee только добавляется метод works , весь остальной код повторяет функционал класса Person. Но чтобы не дублировать функционал одного класса в другом, в данном случае лучше применить наследование.

Итак, унаследуем класс Employee от класса Person:

class Person: def __init__(self, name): self.__name = name # имя человека @property def name(self): return self.__name def display_info(self): print(f"Name: ") class Employee(Person): def work(self): print(f" works") tom = Employee("Tom") print(tom.name) # Tom tom.display_info() # Name: Tom tom.work() # Tom works

Класс Employee полностью перенимает функционал класса Person, лишь добавляя метод work() . Соответственно при создании объекта Employee мы можем использовать унаследованный от Person конструктор:

И также можно обращаться к унаследованным атрибутам/свойствам и методам:

print(tom.name) # Tom tom.display_info() # Name: Tom

Однако, стоит обратить внимание, что для Employee НЕ доступны закрытые атрибуты типа __name. Например, мы НЕ можем в методе work обратиться к приватному атрибуту self.__name :

def work(self): print(f" works") # ! Ошибка

Множественное наследование

Одной из отличительных особенностей языка Python является поддержка множественного наследования, то есть один класс можно унаследовать от нескольких классов:

# класс работника class Employee: def work(self): print("Employee works") # класс студента class Student: def study(self): print("Student studies") class WorkingStudent(Employee, Student): # Наследование от классов Employee и Student pass # класс работающего студента tom = WorkingStudent() tom.work() # Employee works tom.study() # Student studies

Здесь определен класс Employee, который представляет сотрудника фирмы, и класс Student, который представляет учащегося студента. Класс WorkingStudent, который представляет работающего студента, не определяет никакого функционала, поэтому в нем определен оператор pass . Класс WorkingStudent просто наследует функционал от двух классов Employee и Student. Соответственно у объекта этого класса мы можем вызвать методы обоих классов.

При этом наследуемые классы могут более сложными по функциональности, например:

class Employee: def __init__(self, name): self.__name = name @property def name(self): return self.__name def work(self): print(f" works") class Student: def __init__(self, name): self.__name = name @property def name(self): return self.__name def study(self): print(f" studies") class WorkingStudent(Employee, Student): pass tom = WorkingStudent("Tom") tom.work() # Tom works tom.study() # Tom studies

Источник

Оцените статью