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

#python #python-3.x #inheritance #multiple-inheritance

#python #python-3.x #наследование #множественное наследование

Вопрос:

Почему A не вызывается в этом коде: [это из-за mro: слева направо, тогда должен быть вызван класс?]

 class A:
    
     def __init__(self,name):
        print('inside a',name)
        
class B:
    
     def __init__(self,name):
        print('inside b',name)
        
class C(B,A):
    
     def __init__(self,name):
        print('inside c',name)
        super().__init__(name)
        
c = C('hello')
  

Вывод :

 inside c hello

inside b hello
  

Но когда я определил это как родительский класс, тогда он работает должным образом, как и ожидалось.[Почему класс вызывается здесь ]Код:

 class D:
    
    def __init__(self,name):
        print('inside d',name)
    
class A(D):
    
     def __init__(self,name):
        print('inside a',name)
        super().__init__(name)
        
class B(D):
    
     def __init__(self,name):
        print('inside b',name)
        super().__init__(name)
        
class C(B,A):
    
    def __init__(self,name):
        print('inside c',name)
        super().__init__(name)
        
c = C('hello')
  

вывод:

 inside c hello

inside b hello

inside a hello

inside d hello
  

Комментарии:

1. Чтобы super() правильно работать с множественным наследованием, вы должны использовать его в каждом классе в иерархии — даже базовых классах.

Ответ №1:

В соответствии с порядком разрешения метода поиск элементов выполняется по методологии углубленного первого поиска, то есть в вашем первом примере :

 class A:
    
     def __init__(self,name):
        print('inside a',name)
class B:
    
     def __init__(self,name):
        print('inside b',name)       


class C(B,A):
    
     def __init__(self,name):
        print('inside c',name)
        super().__init__(name)
        
c = C('hello')
  

Сначала: вызывается конструктор C.

Второе: поскольку у вас есть super().init(name) в вашем классе C , он будет вызывать своего левого родителя, т.Е. B.

Третье: он попытается перейти вправо (класс C), но поскольку вы не написали super().init(name) внутри класса B , конструктор класса A не может быть вызван, потому что из класса B он не может перейти в класс Object

                             Object
                             /
                            /  
                           B    A
                              /
                             /
                             C 
  

Если вы напишете super().init(name) в классе B , он будет повторяться от класса объекта справа от объекта, то есть класса A

Например,:

 class A:
    
     def __init__(self,name):
        print('inside a',name)
        
class B:

     def __init__(self,name):
        print('inside b',name)
        super().__init__(name)

        
class C(B,A):
    
     def __init__(self,name):
        print('inside c',name)
        super().__init__(name)

        
c = C('hello')
  

Для получения дополнительной информации посетите:https://www.geeksforgeeks.org/method-resolution-order-in-python-inheritance /

Комментарии:

1. Вы также можете просмотреть линеаризацию C3, чтобы лучше понять MRO en.wikipedia.org/wiki /…