Как вызвать супер метод из класса внуков?
Я работаю с некоторым кодом, который имеет 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 не работает, потому что тип супер не является родительским типом.