Наследование
Наследование — это способность объекта принимать одну или несколько характеристик от других классов объектов, обычно переменных или функций-членов. Можно провести аналогию между этим понятием и наследственностью как передачей характерных черт от родителей к потомству. Например, у ребенка могут быть глаза отца и улыбка матери. Глаза отца и улыбка матери — это черты, которые ребенок наследует от своих родителей. Они выглядят/проявляются одинаково у родителей и потомства.
Информатика использует понятие наследования при создании классов, между которыми устанавливаются отношения “род-вид”. В отношениях “род-вид” один объект связан с другим объектом. Например, собака — это домашнее животное, сельдерей — овощ, а Марс — планета. В отношениях “род-вид” есть две сущности: родитель и ребенок. Родитель в этих отношениях является общей версией ребенка. Собака (ребенок) — это домашнее животное (родитель). В информатике мы называем родительский класс в отношениях “род-вид” “суперклассом”, а дочерний — “подклассом”. Подкласс наследует методы и/или переменные от суперкласса. Теперь напишем код для отношений dog/pet (собака/домашнее животное).
Создание подкласса
Обратите внимание на то, что в приведенных примерах для создания класса Dog мы заключаем Pet в скобки в объявлении класса: Dog(Pet) . Использование этого синтаксиса позволяет сообщить Python, что класс, который мы создаем, является подклассом суперкласса Pet. Поскольку ни один из методов и переменных в классе Pet не является закрытым, подкласс Dog сможет получить доступ ко всем элементам класса Pet. Именно так экземпляр собаки способен вызывать методы feedme() и eat() .
Некоторые атрибуты класса могут быть созданы закрытыми. Создать переменную закрытой означает, что этот атрибут не будет доступен подклассу. Имейте это в виду при проектировании классов!
Полиморфизм
Теперь, когда вы получили представление о наследовании, можно перейти к понятию “полиморфизм”. Полиморфизм — это способность чего-либо иметь несколько форм. Вернемся к предыдущему примеру. Все домашние животные в конечном итоге нуждаются в еде, но способ, которым они питаются, может отличаться. Например, попугай будет есть, клюя корм для птиц, в то время как собака будет есть, пережевывая собачий корм. И попугай, и собака — домашние животные, которые едят пищу, но разница в том, что они едят разную пищу по-разному. Взглянем на пример в коде.
В этом примере собака и попугай переопределяют метод eat(self,food_name) . Переопределение метода означает, что метод в подклассе переопределяет метод, указанный в суперклассе. В этом суть полиморфизма: один и тот же метод, но разные характеристики в зависимости от класса.
Заключение
Мы кратко рассмотрели наследование и полиморфизм в Python. Поначалу эти понятия, возможно, будет непросто усвоить. Лучший способ справиться с этим — разработать классы, которые отражают сущности реального мира, а затем идентифицировать свойственные им отношения “род-вид”.
Переопределение в Python
В этой статье мы собираемся исследовать концепцию переопределения в Python. Мы также собираемся исследовать, какие магические методы и абстрактные классы. Введение введение – это интересная концепция в объектно-ориентированном программировании. Когда метод определения базового класса изменяются в классе подкласса (полученный), это называется … переопределение в Python Подробнее »
- Автор записи
В этой статье мы собираемся исследовать концепцию переопределения в Python. Мы также собираемся исследовать, какие магические методы и абстрактные классы.
Вступление
Переопределение – это интересная концепция в объектно-ориентированном программировании. Когда метод определения базового класса изменяются в классе подкласса (полученный), это называется переопределением метода. Вы сохраняете одну и ту же подпись метода, но изменяя определение или реализацию метода, определенного одним из предков. Нет специальных синтаксисов или дополнительных ключевых слов, необходимых для проведения метода, перекрывающегося в Python. Это очень важная объектно-ориентированная концепция программирования, так как она делает наследство, используя свою полную мощность. Overriding is an interesting concept in object-oriented programming . When the method definitions of a Base Class are changed in a Subclass (Derived) Class this is called a method override. You are keeping the same signature of the method but changing the definition or implementation of a method defined by one of the ancestors. There is no special syntax or additional keywords needed to do method overriding in Python. It is a very important object-oriented programming concept since it makes inheritance exploit its full power. In essence, you are not duplicating code, thus following the programming principle of DRY (do not repeat yourself), and you can enhance the method in the subclass. По сути, вы не дублируете код, таким образом, следуя принципу программирования сухих (не повторяйте себя), и вы можете улучшить метод в подклассе.
Чтобы понять концепцию переопределения, вы должны знать основные концепции объектно-ориентированного программирования, такие как классы и наследство. В Интернете много ресурсов о ООП. To understand the concept of overrides, you must know the basic concepts of object-oriented programming such as classes and inheritance. There are many resources on the internet about OOP. A really good resource is Finxter Academy’s object-oriented Python class: https://academy.finxter.com/university/object-oriented-python/Действительно хороший ресурс – это ориентированный объектно-ориентированный класс Python Academy Academy:
Нужно для переопределения
В следующем примере вы видите, как работает наследование, и проблема не переопределить метод в подклассе. У материнского класса есть метод WHOAMI Это отображает «Я родитель» Отказ In the following example, you see how inheritance works and the problem of not overriding a method in the subclass. The Parent class has a method whoami that displays «I am a parent» . This method is inherited by the Child class. Calling the
Пример наследования без переопределения метода:
Основное переопределение
Следующий пример показывает, как основные переопределенные работы. В этом примере Ребенок Класс имеет определение WHOAMI Метод, который переопределяет метод от Родитель учебный класс. Призывая WHOAMI Метод от Ребенок Класс теперь отображает «Я ребенок» Отказ
Базовый переопределенный пример:
Расширение метода через переопределение
Третий пример показывает, как вы можете простираться Способ в базовом классе путем переопределения метода в подклассе. The third example shows how you can extend a method in a Base Class by overriding the method in the Subclass. To do that we use the
Сотрудник Класс имеет следующие данные для сотрудника: номер сотрудника, имя сотрудника, зарплата и, номер отдела. Эта информация передается в экземпляр объекта в __init__ метод. Showemployeree Способ класса затем отображает эту информацию, отформатированную с помощью новых строк.
Продавец класс наследует от Сотрудник учебный класс. По умолчанию он наследует Showemployeree метод как есть из Сотрудник учебный класс. Единственная проблема заключается в том, что мы хотим показать комиссию, что продавец получает в рамках печатной информации. Вот где требуется переопределение. Мы хотим повторно использовать Showemployeree Метод от Сотрудник учебный класс Но мы хотим продлить его, чтобы добавить информацию комиссии. Это достигается с помощью Super () Встроенная функция. В приведенном ниже примере вы видите, что в Продавец Класс, Super () используется дважды. The Salesman class inherits from the Employee class. By default, it inherits the showEmployee method as-is from the Employee class. The only problem is that we want to display the commission that the salesman receives as part of the printed information. Here is where overriding is needed. We want to reuse the showEmployee method from the
Третий класс называется Генеральный директор использует ту же логику, что и раньше. A third class called CEO uses the same logic as before. The showEmployee method in this case displays the employee information plus the stock options for the
Многократное наследование Переопределение
Понимание Многократное наследование имеет свои проблемы. Одним из них является использование Super () Отказ Вот ссылка на статью об этом вопросе: https://www.datacamp.com/community/tutorials/super-multiple-ineritance-diamond-problem.
В приведенном ниже примере я хотел показать способ переопределить способ из подкласса с несколькими наследованиями. In the example below, I wanted to show a way to override a method from a subclass with multiple inheritance. The example consists of three classes: Account , Customer , and Orders . Пример состоит из трех классов:
- Учетная запись Класс имеет свое имя и номер и метод отображения, который отображает эту информацию.
- Клиент Класс имеет также свое имя и номер и метод отображения, который отображает эту информацию.
- Заказы Класс отображает информацию о заказе для клиента на конкретном счете. Он наследует как из Учетная запись и класс заказов. The
Различные переопределенные сценарии
1 – Методы класса
Методы классов особенные в том смысле, что они могут быть вызваны в классе самостоятельно или по экземплярам класса. Они связывают с классом, поэтому это означает, что первый аргумент, переданный методу, является классом, а не экземпляром.
Методы классов написаны аналогично методам регулярных экземпляров. Одно отличие – это использование Декоратор @classmethod Чтобы определить, что метод является методом класса. Также по Конвенции, а не используя себя, чтобы ссылаться на экземпляр класса, CLS использует для ссылки класса. Class methods are written similarly to regular instance methods. One difference is the use of the
Для получения дополнительной информации о методах класса проверьте это интернет сайт.
Вот пример проблемы, когда вы столкнетесь при переопределении метода класса:
В Подкласс звонок к Parentclass Способ создания не является несвязанным вызовом, как это происходит с нормальным методом экземпляра. Итоги этого звонка – это Типеррор Потому что метод получил слишком много аргументов.
Решение для использования Super () Для успешного использования родительской реализации.
2 – Магические методы
Что такое магические методы?
Magic Methods – это набор методов, которые Python автоматически связывается с каждым определением класса. Ваши классы могут переопределить эти магические методы для реализации различных поведений и заставить их действовать так же, как встроенные классы Python. Ниже вы увидите примеры двух наиболее распространенных: __str__ и __repl__ Отказ Используя эти два метода, вы можете реализовать, как ваши объекты отображаются в виде строк, которые будут важны при отладке и представлении информации пользователю. Переопределение этих методов добавляет гибкость и мощность Python.
__str__ Способ класса используется, когда Python печатает объект. Этот магический метод называется утра Встроенная функция.
__repr__ Способ класса используется для отображения деталей значений объекта. Этот магический метод называется встроенным репре функция.
Вот список магических методов. Вы можете узнать больше о них здесь ( https://www.tutorialsteacher.com/python/magic-methods-in-python ) И подумайте, как переопределить их, чтобы соответствовать вашим потребностям:
3 – Абстрактные классы
Абстрактный класс – это план, что подклассы должны следовать. An abstract class is a blueprint that subclasses must follow. It can be viewed as a contract between the abstract class and the subclass. The abstract class tells you what to do by providing an empty abstract method and the subclass must implement it. By default, you must override the abstract methods defined by the abstract class. In other terms, we are providing a common interface for different implementations of a class. This is very useful for large projects where certain functionality must be implemented. Он можно рассматривать как договор между абстрактным классом и подклассом. An abstract class is a blueprint that subclasses must follow. It can be viewed as a contract between the abstract class and the subclass. The abstract class tells you what to do by providing an empty abstract method and the subclass must implement it. By default, you must override the abstract methods defined by the abstract class. In other terms, we are providing a common interface for different implementations of a class. This is very useful for large projects where certain functionality must be implemented. Абстрактный класс говорит вам, что делать, предоставляя пустой абстрактный метод, а подкласс должен его реализовать. По умолчанию вы должны переопределить абстрактные методы, определенные абстрактным классом. В других условиях мы предоставляем общий интерфейс для разных реализаций класса. Это очень полезно для крупных проектов, где необходимо реализовать определенные функциональные возможности.
Вот пример абстрактного класса и перевысимых методов в подклассах.
Вывод
Переопределение – это базовая концепция, используемая во многих местах в объектно-ориентированном программировании. Вы должны понимать, что он сможет реализовать лучшие классы и изменять их поведение. Эта статья показывает вам несколько примеров, в которых вы можете использовать переопределение в Python. Другие понятия, упомянутые, которые стоит узнать больше о следующих достопримечательностях: магический метод и абстрактные классы.
Полиморфизм в Python
В этой статье мы изучим полиморфизм, разные типы полиморфизма и рассмотрим на примерах как мы можем реализовать полиморфизм в Python.
Что такое полиморфизм?
В буквальном значении полиморфизм означает множество форм.
Полиморфизм — очень важная идея в программировании. Она заключается в использовании единственной сущности(метод, оператор или объект) для представления различных типов в различных сценариях использования.
Давайте посмотрим на пример:
Пример 1: полиморфизм оператора сложения
Мы знаем, что оператор + часто используется в программах на Python. Но он не имеет единственного использования.
Для целочисленного типа данных оператор + используется чтобы сложить операнды.
Итак, программа выведет на экран 3 .
Подобным образом оператор + для строк используется для конкатенации.
В результате будет выведено Python Programming .
Здесь мы можем увидеть единственный оператор + выполняющий разные операции для различных типов данных. Это один из самых простых примеров полиморфизма в Python.
Полиморфизм функций
В Python есть некоторые функции, которые могут принимать аргументы разных типов.
Одна из таких функций — len() . Она может принимать различные типы данных. Давайте посмотрим на примере, как это работает.
Пример 2: полиморфизм на примере функции len()
Вывод:
Здесь мы можем увидеть, что различные типы данных, такие как строка, список, кортеж, множество и словарь могут работать с функцией len() . Однако, мы можем увидеть, что она возвращает специфичную для каждого типа данных информацию.

Полиморфизм функции len()
Полиморфизм в классах
Полиморфизм — очень важная идея в объектно-ориентированном программировании.
Чтобы узнать больше об ООП в Python, посетите эту статью: Python Object-Oriented Programming.
Мы можем использовать идею полиморфизма для методов класса, так как разные классы в Python могут иметь методы с одинаковым именем.
Позже мы сможем обобщить вызов этих методов, игнорируя объект, с которым мы работаем. Давайте взглянем на пример:
Пример 3: полиморфизм в методах класса
Вывод:
Здесь мы создали два класса Cat и Dog . У них похожая структура и они имеют методы с одними и теми же именами info() и make_sound() .
Однако, заметьте, что мы не создавали общего класса-родителя и не соединяли классы вместе каким-либо другим способом. Даже если мы можем упаковать два разных объекта в кортеж и итерировать по нему, мы будем использовать общую переменную animal . Это возможно благодаря полиморфизму.
Полиморфизм и наследование
Как и в других языках программирования, в Python дочерние классы могут наследовать методы и атрибуты родительского класса. Мы можем переопределить некоторые методы и атрибуты специально для того, чтобы они соответствовали дочернему классу, и это поведение нам известно как переопределение метода(method overriding).
Полиморфизм позволяет нам иметь доступ к этим переопределённым методам и атрибутам, которые имеют то же самое имя, что и в родительском классе.
Давайте рассмотрим пример:
Пример 4: переопределение метода
Вывод:
Здесь мы можем увидеть, что такие методы как __str__() , которые не были переопределены в дочерних классах, используются из родительского класса.
Благодаря полиморфизму интерпретатор питона автоматически распознаёт, что метод fact() для объекта a (класса Square ) переопределён. И использует тот, который определён в дочернем классе.
С другой стороны, так как метод fact() для объекта b не переопределён, то используется метод с таким именем из родительского класса( Shape ).

Полиморфизм на примере дочерних и родительских классов в питоне
Заметьте, что перегрузка методов(method overloading) — создание методов с одним и тем же именем, но с разными типами аргументов не поддерживается в питоне.
Понимание наследования классов в Python 3
Объектно-ориентированное программирование создает многократно используемые шаблоны кода для сокращения избыточности в проектах разработки. Одним из способов, которым объектно-ориентированное программирование достигает кода, пригодного для повторного использования, является наследование, когда один подкласс может использовать код из другого базового класса.
В этом руководстве будут рассмотрены некоторые из основных аспектов наследования в Python, включая то, как работают родительские классы и дочерние классы, как переопределять методы и атрибуты, как использовать функцию super() и как использовать множественное наследование. .
Что такое наследование?
Inheritance — это когда класс использует код, созданный внутри другого класса. Если мы думаем о наследовании с точки зрения биологии, мы можем думать о ребенке, унаследовавшем определенные черты от своего родителя. То есть ребенок может наследовать рост или цвет глаз родителя. Дети также могут иметь одинаковую фамилию со своими родителями.
Классы, называемыеchild classes илиsubclasses, наследуют методы и переменные отparent classes илиbase classes.
Мы можем представить себе родительский класс с именем Parent , у которого естьclass variables для last_name , height и eye_color , которые наследует дочерний класс Child из Parent .
Поскольку подкласс Child наследуется от базового класса Parent , класс Child может повторно использовать код Parent , что позволяет программисту использовать меньше строк кода и уменьшить избыточность .
Родительские классы
Родительские или базовые классы создают шаблон, на котором могут основываться дочерние или подклассы. Родительские классы позволяют нам создавать дочерние классы посредством наследования без необходимости каждый раз переписывать один и тот же код. Любой класс может быть превращен в родительский класс, поэтому каждый из них является самостоятельным полностью функциональным классом, а не просто шаблоном.
Допустим, у нас есть общий родительский класс Bank_account , у которого есть дочерние классы Personal_account и Business_account . Многие методы между личными и корпоративными счетами будут похожи, например методы снятия и внесения денег, поэтому они могут принадлежать к родительскому классу Bank_account . Подкласс Business_account будет иметь специфические для него методы, включая, возможно, способ сбора бизнес-записей и форм, а также переменную employee_identification_number .
Точно так же класс Animal может иметь методы eating() и sleeping() , а подкласс Snake может включать свои собственные специфические методы hissing() и slithering() .
Давайте создадим родительский класс Fish , который мы позже будем использовать для создания типов рыб в качестве его подклассов. Каждая из этих рыб будет иметь имена и фамилии в дополнение к характеристикам.
Мы создадим новый файл с именем fish.py и начнем с __init__() constructor method, который мы заполним переменными класса first_name и last_name для каждого объекта Fish . или подкласс.
Мы инициализировали нашу переменную last_name строкой «Fish» , потому что мы знаем, что у большинства рыбок будет эта фамилия.
Давайте также добавим некоторые другие методы:
Мы добавили методы swim() и swim_backwards() в класс Fish , чтобы каждый подкласс также мог использовать эти методы.
Поскольку большинство рыб, которые мы будем создавать, считаютсяbony fish (так как у них скелет сделан из кости), а неcartilaginous fish (поскольку у них скелет сделан из хряща) , мы можем добавить еще несколько атрибутов к методу __init__() :
Создание родительского класса следует той же методологии, что и любой другой класс, за исключением того, что мы думаем о том, какие методы дочерние классы смогут использовать после их создания.
Детские классы
Дочерние или подклассы — это классы, которые будут наследоваться от родительского класса. Это означает, что каждый дочерний класс сможет использовать методы и переменные родительского класса.
Например, дочерний класс Goldfish , который является подклассом класса Fish , сможет использовать метод swim() , объявленный в Fish , без необходимости его объявления.
Мы можем думать о каждом дочернем классе как о классе родительского класса. То есть, если у нас есть дочерний класс с именем Rhombus и родительский класс с именем Parallelogram , мы можем сказать, что a Rhombus is a Parallelogram , как и Goldfish is a Fish .
Первая строка дочернего класса выглядит немного иначе, чем не дочерние классы, так как вы должны передать родительский класс в дочерний класс в качестве параметра:
Класс Trout является дочерним по отношению к классу Fish . Мы знаем это благодаря включению в скобки слова Fish .
С дочерними классами мы можем добавить дополнительные методы, переопределить существующие родительские методы или просто принять родительские методы по умолчанию с ключевым словом pass , что мы и сделаем в этом случае:
Теперь мы можем создать объект Trout без необходимости определять какие-либо дополнительные методы.
Мы создали объект Trout terry , который использует каждый из методов класса Fish , хотя мы не определили эти методы в дочернем классе Trout . Нам нужно было только передать значение «Terry» переменной first_name , потому что все другие переменные были инициализированы.
Когда мы запустим программу, мы получим следующий вывод:
Далее, давайте создадим еще один дочерний класс, который включает в себя собственный метод. Назовем этот класс Clownfish , и его специальный метод позволит ему жить с морским анемоном:
Затем давайте создадим объект Clownfish , чтобы увидеть, как это работает:
Когда мы запустим программу, мы получим следующий вывод:
Выходные данные показывают, что объект Clownfish casey может использовать методы Fish __init__() и swim() , а также метод своего дочернего класса live_with_anemone() с.
Если мы попытаемся использовать метод live_with_anemone() в объекте Trout , мы получим ошибку:
Это связано с тем, что метод live_with_anemone() принадлежит только дочернему классу Clownfish , а не родительскому классу Fish .
Дочерние классы наследуют методы родительского класса, к которому он принадлежит, поэтому каждый дочерний класс может использовать эти методы в программах.
Переопределение родительских методов
До сих пор мы рассматривали дочерний класс Trout , который использовал ключевое слово pass для наследования всего поведения родительского класса Fish , и еще один дочерний класс Clownfish , который унаследовал все поведения родительского класса, а также создал свой собственный уникальный метод, специфичный для дочернего класса. Однако иногда нам захочется использовать некоторые из поведений родительского класса, но не все. Когда мы меняем методы родительского класса, мыoverrideих.
При создании родительских и дочерних классов важно помнить о разработке программы, чтобы переопределение не приводило к ненужному или избыточному коду.
Мы создадим дочерний класс Shark родительского класса Fish . Поскольку мы создали класс Fish с идеей, что мы будем создавать в основном костлявую рыбу, нам нужно будет внести изменения для класса Shark , который вместо этого является хрящевой рыбой. С точки зрения разработки программы, если бы у нас было более одной не костистой рыбы, мы, скорее всего, хотели бы создать отдельные классы для каждого из этих двух типов рыб.
У акул, в отличие от костистых рыб, вместо кости есть скелеты из хряща. У них также есть веки, и они не могут плавать назад. Акулы могут, однако, маневрировать в обратном направлении, погружаясь.
В свете этого мы переопределим метод конструктора __init__() и метод swim_backwards() . Нам не нужно изменять метод swim() , поскольку акулы — это рыба, которая умеет плавать. Давайте посмотрим на этот дочерний класс:
Мы переопределили инициализированные параметры в методе __init__() , так что переменная last_name теперь установлена равной строке «Shark» , переменная skeleton теперь установлена равной строка «cartilage» , а для переменной eyelids теперь установлено логическое значение True . Каждый экземпляр класса также может переопределять эти параметры.
Метод swim_backwards() теперь выводит строку, отличную от строки в родительском классе Fish , потому что акулы не могут плавать назад так, как это могут делать костлявые рыбы.
Теперь мы можем создать экземпляр дочернего класса Shark , который по-прежнему будет использовать метод swim() родительского класса Fish :
Когда мы запустим этот код, мы получим следующий вывод:
Дочерний класс Shark успешно переопределил методы __init__() и swim_backwards() родительского класса Fish , а также унаследовал метод swim() родительского класса.
Когда будет ограниченное число дочерних классов, которые являются более уникальными, чем другие, переопределение методов родительского класса может оказаться полезным.
Функция super()
С помощью функции super() вы можете получить доступ к унаследованным методам, которые были перезаписаны в объекте класса.
Когда мы используем функцию super() , мы вызываем родительский метод в дочерний метод, чтобы использовать его. Например, мы можем захотеть переопределить один аспект родительского метода с определенной функциональностью, но затем вызвать остальную часть исходного родительского метода, чтобы завершить метод.
В программе, которая оценивает учащихся, мы можем захотеть иметь дочерний класс для Weighted_grade , который наследуется от родительского класса Grade . В дочернем классе Weighted_grade мы можем захотеть переопределить метод calculate_grade() родительского класса, чтобы включить функциональность для вычисления взвешенной оценки, но при этом сохранить остальную функциональность исходного класса. Вызвав функцию super() , мы сможем этого добиться.
Функция super() чаще всего используется в методе __init__() , потому что именно здесь вам, скорее всего, потребуется добавить некоторую уникальность к дочернему классу, а затем завершить инициализацию от родительского.
Чтобы увидеть, как это работает, давайте изменим наш дочерний класс Trout . Поскольку форель обычно является пресноводной рыбой, давайте добавим переменную water к методу __init__() и установим ее равной строке «freshwater» , но затем сохраним остальные переменные и параметры родительского класса:
Мы переопределили метод __init__() в дочернем классе Trout , предоставив другую реализацию __init__() , которая уже определена его родительским классом Fish . В методе __init__() нашего класса Trout мы явно вызвали метод __init__() класса Fish .
Поскольку мы переопределили метод, нам больше не нужно передавать first_name в качестве параметра в Trout , и если бы мы действительно передали параметр, мы бы вместо этого сбросили freshwater . Поэтому мы инициализируем first_name , вызывая переменную в нашем экземпляре объекта.
Теперь мы можем вызывать инициализированные переменные родительского класса, а также использовать уникальную дочернюю переменную. Давайте использовать это в экземпляре Trout :
Выходные данные показывают, что объект terry дочернего класса Trout может использовать как специфичную для ребенка переменную __init__() water , так и возможность вызова Fish родительские переменные __init__() для first_name , last_name и eyelids .
Встроенная функция Python super() позволяет нам использовать методы родительского класса даже при переопределении определенных аспектов этих методов в наших дочерних классах.
Множественное наследование
Multiple inheritance — это когда класс может наследовать атрибуты и методы более чем одного родительского класса. Это может позволить программам уменьшить избыточность, но может также внести определенную сложность, а также двусмысленность, так что это должно быть сделано с учетом общего дизайна программы.
Чтобы показать, как работает множественное наследование, давайте создадим дочерний класс Coral_reef , а не унаследованный от класса Coral и класса Sea_anemone . Мы можем создать метод в каждом из них, а затем использовать ключевое слово pass в дочернем классе Coral_reef :
Класс Coral имеет метод под названием community() , который печатает одну строку, а класс Anemone имеет метод под названием protect_clownfish() , который печатает другую строку. Затем мы вызываем оба класса в наследованиеtuple. Это означает, что Coral наследуется от двух родительских классов.
Давайте теперь создадим экземпляр объекта Coral :
Объект great_barrier установлен как объект CoralReef и может использовать методы обоих родительских классов. Когда мы запустим программу, мы увидим следующий вывод:
Вывод показывает, что методы из обоих родительских классов эффективно использовались в дочернем классе.
Множественное наследование позволяет нам использовать код более чем одного родительского класса в дочернем классе. Если один и тот же метод определен в нескольких родительских методах, дочерний класс будет использовать метод первого родителя, объявленного в его списке кортежей.
Хотя это может быть эффективно использовано, множественное наследование должно осуществляться с осторожностью, чтобы наши программы не становились двусмысленными и трудными для понимания другими программистами.
Заключение
В этом руководстве было рассмотрено создание родительских и дочерних классов, переопределение родительских методов и атрибутов в дочерних классах с использованием функции super() и разрешение дочерним классам наследовать от нескольких родительских классов.
Наследование в объектно-ориентированном кодировании может позволить придерживаться СУХОГО (не повторяйся) принципа разработки программного обеспечения, что позволяет делать больше с меньшими затратами кода и повторений. Наследование также заставляет программистов задуматься о том, как они проектируют создаваемые ими программы, чтобы обеспечить эффективность и ясность кода.