Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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 my_method.

Ответ 2

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

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()

Ответ 3

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

class Vehicle:

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

    # instance 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 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 мк

Ответ 4

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

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 дедушки и дедушки

Другой путь

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, указывая имя класса.

Ответ 5

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

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__ пустым или циклическим, если ваши средние классы имеют множественное наследование. Nesting super не работает, потому что тип супер не является родительским типом.