Рубрики
Без рубрики

Python Многократное наследование

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

Автор оригинала: 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.