Python многоуровневое наследование - PullRequest
0 голосов
/ 18 февраля 2020
class A:  
    def foo(self):  
        print("original")  
class B(A):  
    def foo(self):  
        super().foo()  
        print("override")  
class C(B):  
    def foo(self):
      super().foo()
       print("override")

o = c()

Теперь, после определения этого объекта, я хочу получить доступ к foo класса A через тот же объект, как мне это сделать ???

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Если вы действительно хотите обойти все реализации дочернего класса, просто назовите базовый класс явно, например, замените:

self.method_name()  # Calls own class (or first parent with implementation if own class lacks it)
super().method_name()  # Call first parent class with implementation of the method

на:

GrandparentClass.method_name(self)  # Explicitly calls specific class's version of the method with self

Для ясности, GrandparentClass - это местозаполнитель для фактического имени класса верхнего уровня, который вы хотите вызвать, это не специальное имя / функция, как super().

Примечание. Если вы делаете это, скорее всего, у вас есть проблема XY , которую, вероятно, следует решить вместо нее.

0 голосов
/ 18 февраля 2020

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

super().<method_name>(<params>) is как вы вызываете метод «в родительском классе» для делегирования вверх.

class A:
    def foo(self):
        print("original")
class B(A):
    def foo(self):
        super().foo()
        print("override")

Вызов B().foo() выведет «original», а затем «override».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...