Автор оригинала: Pankaj Kumar.
Мы собираемся узнать о Python с несколькими наследованием сегодня. Перед началом множества наследования я предлагаю вам понравиться с помощью класса Python и наследование Python, если вы не знакомы с ними.
Python Многократное наследование
Имя говорит само за себя. Один класс, проходящий более одного класса, называется нескольким наследством. Это одна из прохладных блюд Python, которая делает его более удобным, чем Java в некоторых случаях (Java не поддерживает несколько наследний). Java не имеет этого, потому что иногда несколько наследство может создать некоторую двусмысленность. Мы поговорим об этом позже в этом руководстве.
Многочисленное наследование против многоуровневого наследования
Это может показаться запутанным, если вы знакомы с многоуровневым наследством ранее. Основное отличие между множественным и многоуровневым наследством заключается в том, что в многоуровневом наследовании суперкласс также может наследовать другой супер класс. И таким образом различные уровни наследования могут быть созданы среди классов.
Пример наследования Python
Давайте продемонстрируем короткий пример нескольких наследний наследования Python.
#definition of the class starts here
class Person:
#defining constructor
def __init__(self, personName, personAge):
self.name = personName
self.age = personAge
#defining class methods
def showName(self):
print(self.name)
def showAge(self):
print(self.age)
#end of class definition
# defining another class
class Student: # Person is the
def __init__(self, studentId):
self.studentId = studentId
def getId(self):
return self.studentId
class Resident(Person, Student): # extends both Person and Student class
def __init__(self, name, age, id):
Person.__init__(self, name, age)
Student.__init__(self, id)
# Create an object of the subclass
resident1 = Resident('John', 30, '102')
resident1.showName()
print(resident1.getId())
Классы и студент – это суперкласс здесь, и житель – подкласс. Житель класса расширяет как личность, так и ученика, чтобы наследовать свойства обоих классов. Пример легко понятен, если у вас малейшие знания класса Python и наследования Python. Этот код дает следующий вывод.
/usr/bin/python3.5 "/home/imtiaz/PycharmProjects/python tutorial - 1/multiple_inheritance.py" John 102 Process finished with exit code 0
Разрешение конфликтов с Python Multious наследство
Давайте посмотрим на другой пример.
class A:
def __init__(self):
self.name = 'John'
self.age = 23
def getName(self):
return self.name
class B:
def __init__(self):
self.name = 'Richard'
self.id = '32'
def getName(self):
return self.name
class C(A, B):
def __init__(self):
A.__init__(self)
B.__init__(self)
def getName(self):
return self.name
C1 = C()
print(C1.getName())
Класс C наследует как A, так и B., и у них обоих есть атрибут «Имя». Из какого класса стоимость имени будет унаследовано в C? Это из или б? Как вы думаете? Ну, вывод:
/usr/bin/python3.5 "/home/imtiaz/PycharmProjects/python tutorial - 1/multiple_inheritance.py" Richard Process finished with exit code 0
Имя, когда напечатано «Ричард» вместо «Джона». Попробуем понять, что здесь происходит. В конструкторе C первый конструктор называется одним из A. Итак, значение имени в C становится таким же, как значение имени в A., но после этого, когда конструктор B вызывается, значение имени В C перезаписывается значением имени в B. Итак, атрибут имени C сохраняет значение «Richard» при напечатании. Результат будет же, даже если мы объявили класс C как:
Class C(B, A):
Иерархия становится полностью зависеть от порядка __init __ () вызовов внутри подкласса. Чтобы справиться с этим прекрасно, существует протокол по имени MRO (порядок разрешения метода).
Порядок разрешения метода (MRO)
Давайте заменим предыдущий код слегка модифицированной версией.
class A:
def __init__(self):
super().__init__()
self.name = 'John'
self.age = 23
def getName(self):
return self.name
class B:
def __init__(self):
super().__init__()
self.name = 'Richard'
self.id = '32'
def getName(self):
return self.name
class C(A, B):
def __init__(self):
super().__init__()
def getName(self):
return self.name
C1 = C()
print(C1.getName())
Можете ли вы угадать вывод? Ну давайте узнаем.
/usr/bin/python3.5 "/home/imtiaz/PycharmProjects/python tutorial - 1/multiple_inheritance.py" John Process finished with exit code 0
MRO работает на глубине, сначала оставлена вправо. Super () В методе __init__ указывает на класс, который находится в следующей иерархии. Сначала супер () из C указывает A. Затем супер в конструкторе поиска его суперкласса. Если он не найдет, он выполняет остальную часть кода и возврат. Таким образом, порядок, в котором называются конструкторы: C -> A -> B, если мы называем печать (c .__ mro__), то мы можем увидеть MRO Traceroute.
(, , , )
Как только конструктор A называется и атрибут «имя», доступ к имени «Имя» не доступа к атрибуту «Имя» в B. Лучшее понимание MRO является обязательным для работы с Python Multious Naxeritance.
Таким образом, это было для Python Multious Naxeritance, надеюсь пойти с более интересными функциями Python после этого. Счастливое кодирование!
Ссылка: Python Doc.