到目前为止,这让我很困惑,下面的代码该如何理解给出的结果。有人能解释一下下面两部分输出的实际流程吗?第一部分输出为“C”,第二部分输出为“A”。
class A:
def fun1(self):
print("A")
class B(A):
def fun1(self):
print('B')
class C(A):
def fun1(self):
print("C")
class D(B, C):
def fun1(self):
super(B, self).fun1()
obj = D()
obj.fun1() **# How output will be 'C' in this case ?**
output : C
class A:
def fun1(self):
print("A")
class B(A):
def fun1(self):
print("B")
class C(A):
def fun1(self):
print("C")
class D(B, C):
def fun1(self):
super(C, self).fun1()
obj = D()
obj.fun1() **# How output will be 'A' in this case ?**
output : A
Python使用C3线性化来计算确定性方法解析顺序(MRO)。这是一个有据可查的算法,但似乎这并不是您真正想要的。
看起来您正在询问这些参数的含义
super
和super()
工作原理,因为理解这一点可以解释为什么您发布的两个示例会给出它们的输出。调用
super()
会返回一个超级代理对象。每当你访问该对象上的方法时,MRO 都会决定你访问的是哪个方法。如果没有参数,生成的代理在当前对象上查找要访问的内容时,会先查找当前实例的类。如果创建代理时带有参数,则需要两个参数:MRO 中的父类(它应该从该类之后开始查找)以及它具体应用到的对象。
因此,在您的示例中:
这里的输出是,
C
因为可以在中fun1
找到。它没有在 上找到它,因为你明确地告诉它在 MRO 中开始查找,而这里的 MRO 是。super(B, self)
C
B
super
B
obj
D, B, C, A, object
将第二个示例添加到相同的代码中:
输出将是
A
,因为的 MROobj
是,E, B, C, A, object
并且您告诉它开始照顾C
。如果您想知道为什么是 MRO,
D/E, B, C, A, object
您可以查看有关C3 线性化的维基百科文章。如果你只想知道如何判断特定对象的 MRO 是什么,那么 Python 就可以告诉你:
输出(对于第一个例子):
(假设您的类定义在主模块中。)