Наследование позволяет нам определить класс, который берет всю функциональность от родительского класса и позволяет нам добавлять больше. родительский класс - это наследуемый класс, также называемый базовым классом. Дочерний класс - это класс, который наследуется от другого класса, также называемого производным классом.

Давайте посмотрим на пример:

class Student:
 def__init__(self,name,rollno,marks):
  self.name = name
  self.rollno = rollno
  self.marks = marks
 def Info(self):
  print('Student name is ',self.name,'roll no ',self.rollno)
class Result(Student):
 def res(self):
  if(self.marks>50):
   print("pass")
  else:
   print("Fail")

В приведенной выше программе класс Student является родительским классом, а класс Result - подклассом. Мы можем выполнять методы, определенные в классе Student, также через класс Result.

t = Result('tom',234,75)
t.Info()
Student name is tom rollno is 234

Что такое композиция?

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

Пример:

class Student:
 def__init__(self,name,rollno,marks):
  self.name = name
  self.rollno = rollno
  self.marks = marks
 def Info(self):
  print('Student name is ',self.name,'roll no ',self.rollno)
class Result:
 def __init__(self,name,rollno,marks)
  self.student = Student(name,rollno,marks)
 def printInfo:
  self.student.Info()
s = Result('sam',233,56)
s.printInfo()

Композиция аналогична наследованию, но мы не можем вызывать методы класса, который мы определили внутри класса результата.

Наследование против композиции

Наследование определяется как «является отношением», тогда как композиция определяется как «имеет отношение». При наследовании класс создается как подкласс другого класса, тогда как в композиции класс в некоторой степени вызывается внутри другого класса.

Давайте посмотрим на пример, выполнив те же операции с использованием наследования и композиции.

class Employee:
 def __init__(self,name,eid):
  self.name = name  
  self.eid = eid
 def printDetails(self):
  print('Employee name is {} and Employee no is     {}'.format(self.name,self.eid))
#inheritance - is a relationship
class Supervisior(Employee):
 pass
#composition - has a relationship
class TL():
 def __init__(self,name,eid):
  self.employee = Employee(name,eid)
 def empDetails(self):
  self.employee.printDetails()

Здесь мы печатаем детали сотрудников, используя два разных класса.

s = Supervisior('jon',25)
t = TL('Tom',30)
s.printDetails()
t.empDetails()
Employee name is jon and Employee no is 25
Employee name is Tom and Employee no is 30

Мы видим, что мы можем напрямую вызвать метод родительского класса в подклассе, используя наследование, тогда как в композиции мы должны определить его в другом модуле.

Типы наследования

Одинарное наследование

Единичное наследование позволяет производному классу наследовать свойства от единственного родительского класса, что позволяет повторно использовать код и добавлять новые функции в существующий код.

Пример:

class P:
 def mym1(self):
  print('Parent Method')
class Q(P):
 def mym2(self):
  print('Child Method')
a = Q()
a.mym2()
a.mym1()
Child method
Parent method

Многоуровневое наследование

При многоуровневом наследовании функции базового класса и производного класса далее наследуются в новый производный класс. Это похоже на отношения между ребенком и дедушкой.

Пример:

class P:
 def mym1(self):
  print('Parent Method')
class Q(P):
 def mym2(self):
  print('Child Method')
class R(Q):
 def mym3(self):
  print('Muli-level inheritance Method')
a = R()
a.mym3()
a.mym2()
a.mym1()
Muli-level inheritance Method
Child method
Parent method

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

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

Пример:

class P:
 def mym1(self):
  print('Parent1 Method')
class Q():
 def mym2(self):
  print('Parent2 Method')
class R(Q,R):
 def mym3(self):
  print('Child Method')
a = R()
a.mym3()
a.mym2()
a.mym1()
Child method
Parent2 method
Parent1 method

Иерархическое наследование

Когда из одной базы создается более одного производного класса, этот тип наследования называется иерархическим наследованием. В этой программе у нас есть родительский (базовый) класс и два дочерних (производных) класса.

Пример:

class P:
 def mym1(self):
  print('Parent Method')
class Q(P):
 def mym2(self):
  print('Child1 Method')
class R(Q,R):
 def mym3(self):
  print('Child2 Method')
a = R()
b = Q()
b.mym3()
b.mym1()
a.mym3()
a.mym1()
Child1 method
Parent method
Child2 method
Parent method

Гибридное наследование

Наследование, состоящее из нескольких типов наследования, называется гибридным наследованием.

Циклическое наследование:

Два класса, наследующие друг друга.

class P(Q): 
 pass
class Q(P):
 pass

Порядок разрешения методов (MRO)

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

class A:pass
class B:pass
class C:pass
class D(A):pass
class E(B):pass
class F(D,E,C):pass
F.mro()
[__main__.F,  __main__.D,  __main__.A,  __main__.E,  __main__.B,  __main__.C,  object]

Вот и все. Надеюсь, вы нашли эту статью полезной, поскольку она дала вам твердое представление о том, как выполняется наследование в Python. Спасибо.

Больше контента на plainenglish.io