我正在使用一些具有3级继承级别的代码。从最低级派生类,调用方法2的语法是什么级别,例如,层次结构,例如超级电话? “中间”类没有实现我需要调用的方法。
答案 0 :(得分:57)
嗯,这是一种方法:
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,除非我弄错了。你问的是什么声音反pythonic你必须解释为什么你这样做让我们给你愉快的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
仍然可以使用super来获取Parent
“看到”的方法,即{{ 1}} Grandparent
。
答案 1 :(得分:26)
这对我有用:
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()
答案 2 :(得分:0)
已在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()
输出:
宝马M3轿车的价格为40000欧元
汽车Mercede MarcoPolo的价格为80000欧元
它的尺寸为15 mq
答案 3 :(得分:-1)
您可以通过以下方式执行此操作
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函数
另一种方式,但不是pythonic方式
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函数。
答案 4 :(得分:-2)
如果你想要两个等级,为什么不做呢
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__
是否为空或循环覆盖它。嵌套超级不起作用,因为超类型不是父类型。