Я работаю с некоторым кодом, который имеет 3 уровня наследования класса. Из класса с наименьшим уровнем, что является синтаксисом для вызова метода 2, выравнивает иерархию, например. вызов super.super? "Средний" класс не реализует метод, который мне нужно вызвать.
Как вызвать супер метод из класса внуков?
Ответ 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 не работает, потому что тип супер не является родительским типом.