假设A类继承自B,B继承自C。
class C():
def my_method(self):
pass
class B(C):
def my_method(self):
pass
class A(B):
def my_method(self):
# Call my_method from B
super(A, self).my_method()
# How can I call my_method from C here ?
问题:如何从C调用my_method?
答案 0 :(得分:1)
您可以直接调用“未绑定”方法调用C
的{{1}}方法,并将my_method()
作为参数传递。例如:
self
运行时,将打印以下内容(请注意,class C(object):
def my_method(self):
print('C.my_method')
class B(C):
def my_method(self):
print('B.my_method')
class A(B):
def my_method(self):
print('A.my_method')
super(A, self).my_method() # calls B.my_method(self)
C.my_method(self) # calls C.my_method(self)
a = A()
a.my_method()
需要(object)
才能使用Python 2.x):
super()
然而,正如其他人所指出的,这可能不是达到你想要的最佳方式。你能举一个具体的例子说明你在上下文中想要达到的目标吗?
答案 1 :(得分:0)
您可以使用__mro__
属性访问对象的完整祖先:
In [3]: KeyError.__mro__
Out[3]: (KeyError, LookupError, StandardError, Exception, BaseException, object)
答案 2 :(得分:0)
首先,如果你想使用超级函数,那么你必须使用基类作为这样的对象
class c(object):
pass
因为超级功能仅支持python的新式编程。
现在来谈谈如何访问基类的基类功能。在你的例子中,如何从A。
调用C类的my_method函数您可以通过静态和动态两种方式执行此操作。
<强>动态强>
class C(object):
def my_method(self):
print "in function c"
class B(C):
def my_method(self):
print "in function b"
class A(B):
def my_method(self):
# Call my_method from B
super(A, self).my_method()
# This is how you can call my_method from C here ?
super((self.__class__.__bases__)[0], self).my_method()
obj_a = A()
obj_a.my_method()
这里(self.__class__.__bases__
)将返回元组类型的A的基类,这就是我获取第0个索引的原因。所以它返回B类,因此在超级中将B类作为参数,它将返回b类基类的my_method函数。
<强>静强>
class C(object):
def my_method(self):
print "in function c"
class B(C):
def my_method(self):
print "in function b"
class A(B):
def my_method(self):
# Call my_method from B
super(A, self).my_method()
# This is how you can call my_method from C here ?
obj_a = A()
super(A,obj_a).my_method() # calls function of class B
super(B,obj_a).my_method() # calls function of class A