Как вызвать супер метод из класса внуков?

Я работаю с некоторым кодом, который имеет 3 уровня наследования классов. Начиная с производного класса самого низкого уровня, каков синтаксис для вызова метода 2, повышающего уровень иерархии, например, вызов super.super? "Средний" класс не реализует метод, который мне нужно вызвать.

4 ответа

Решение

Ну, это один из способов сделать это:

class Grandparent(object):
    def my_method(self):
        print "Grandparent"

class Parent(Grandparent):
    def my_method(self):
        print "Parent"

class Child(Parent):
    def my_method(self):
        print "Hello Grandparent"
        Grandparent.my_method(self)

Может быть, не то, что вы хотите, но это лучший питон, если я не ошибаюсь. То, что вы спрашиваете, звучит анти-пифонично, и вам придется объяснить, почему вы делаете это для нас, чтобы дать вам счастливый способ Python.

Другой пример, может быть, то, что вы хотите (из ваших комментариев):

class Grandparent(object):
    def my_method(self):
        print "Grandparent"

class Parent(Grandparent):
    def some_other_method(self):
        print "Parent"

class Child(Parent):
    def my_method(self):
        print "Hello Grandparent"
        super(Child, self).my_method()

Как вы видете, Parent не реализует my_method но Child все еще можно использовать супер, чтобы получить метод, который Parent "видит", т.е. Grandparent"s my_method,

Это работает для меня:

class Grandparent(object):
    def my_method(self):
        print "Grandparent"

class Parent(Grandparent):
    def my_method(self):
        print "Parent"

class Child(Parent):
    def my_method(self):
        print "Hello Grandparent"
        super(Parent, self).my_method()

Если вы хотите два уровня, почему бы просто не сделать

class GrandParent(object):                                                       

    def act(self):                                                               
        print 'grandpa act'                                                      

class Parent(GrandParent):                                                       

    def act(self):                                                               
        print 'parent act'                                                       

class Child(Parent):                                                             

    def act(self):                                                               
        super(Child.__bases__[0], self).act()                                    
        print 'child act'                                                        


instance = Child()                                                               
instance.act()

# Prints out
# >>> grandpa act
# >>> child act      

Вы можете добавить что-то оборонительное, например, проверить, __bases__ пуст или цикличен, если у вашего среднего класса множественное наследование. Вложение super не работает, потому что тип super не является родительским типом.

Сделано и протестировано в Python 3

class Vehicle:

# Initializer / Instance Attributes
def __init__(self, name, price):
    self.name = name
    self.price = price

# instance's methods
def description(self):
    print("\nThe car {} has a price of {} eur".format(self.name, self.price))
#Object Vehicle

 m3 = Vehicle("BMW M3", 40000)

 m3.description()

 class Camper(Vehicle):

 def __init__(self,nome,prezzo,mq):
     super().__init__(nome,prezzo)
     self.mq=mq

     # instance's methods

 def description(self):
     super().description()
     print("It has a dimension of",format(self.mq)+" mq")

 #Camper Object(A camper is also a Vehicle)
 marcopolo=Camper("Mercede MarcoPolo",80000,15)

 marcopolo.description()

Выход:
Автомобиль BMW M3 имеет цену 40000 евро
Автомобиль Mercede MarcoPolo имеет цену 80000 евро
Он имеет размер 15 мк

Вы можете сделать это следующими способами

class Grandparent(object):
    def my_method(self):
        print "Grandparent"

class Parent(Grandparent):
    def my_other_method(self):
        print "Parent"

class Child(Parent):
    def my_method(self):
        print "Inside Child"
        super(Child, self).my_method()

В этом случае Child будет вызывать базовый класс my_method, но базового класса my_method там нет, поэтому он будет вызывать базовый класс родительского класса my_method таким образом, что мы можем вызвать функцию my_method у grandparent.

По-другому

class Grandparent(object):
    def my_method(self):
        print "Grandparent"

class Parent(Grandparent):
    def my_other_method(self):
        print "Parent"

class Child(Parent):
    def my_method(self):
        print "Inside Child"
        super(Parent, self).my_method()

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

Другой путь, но не питонический

class Grandparent(object):
    def my_method(self):
        print "Grandparent"

class Parent(Grandparent):
    def my_other_method(self):
        print "Parent"

class Child(Parent):
    def my_method(self):
        print "Inside Child"
        Grandparent.my_method()

Таким образом, мы напрямую вызываем функцию my_method, указывая имя класса.

Другие вопросы по тегам