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