如何从孙子 class 调用超级方法?
How to call super method from grandchild class?
我正在处理一些具有 3 级 class 继承的代码。从最低级别派生 class,调用层次结构中的方法 2 的语法是什么,例如super.super 电话? "middle" class 没有实现我需要调用的方法。
嗯,这是一种方法:
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
"sees" 的方法, 即 Grandparent
的 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 的类型不是父类型。
您可以通过以下方式完成
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()
In this case Child will call base class my_method but base class my_method is not present there so it will call base class of parent class my_method in this way we can call my_method function of 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()
In this way we are directly calling function base class my_method function of the parent class
另一种方式,但不是 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()
In this way we are directly calling my_method function by specifying the class name.
这对我有用:
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()
在 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 mq
我正在处理一些具有 3 级 class 继承的代码。从最低级别派生 class,调用层次结构中的方法 2 的语法是什么,例如super.super 电话? "middle" class 没有实现我需要调用的方法。
嗯,这是一种方法:
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
"sees" 的方法, 即 Grandparent
的 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 的类型不是父类型。
您可以通过以下方式完成
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()
In this case Child will call base class my_method but base class my_method is not present there so it will call base class of parent class my_method in this way we can call my_method function of 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()
In this way we are directly calling function base class my_method function of the parent class
另一种方式,但不是 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()
In this way we are directly calling my_method function by specifying the class name.
这对我有用:
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()
在 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 mq