【发布时间】:2021-09-08 03:56:59
【问题描述】:
我刚刚阅读了 GvR 的Method Resolution Order,但我想知道Python's Super is nifty, but you can't use it 中的以下陈述是否成立(我同意这一点)。那么super() 会导致调用 MRO 中的下一个方法吗?在this comment 中也有注明。
“super”的一个大问题是它听起来会导致 要调用的方法的超类副本。这根本不是 在这种情况下,它会导致调用 MRO 中的下一个方法 (...)
class A(object):
def __init__(self):
#super(A, self).__init__()
print 'init A'
class B(object):
def __init__(self):
print 'init B'
class C(A, B):
def __init__(self):
super(C, self).__init__()
print 'init C'
c = C()
给予
init A
init C
虽然
class A(object):
def __init__(self):
super(A, self).__init__()
print 'init A'
class B(object):
def __init__(self):
print 'init B'
class C(A, B):
def __init__(self):
super(C, self).__init__()
print 'init C'
c = C()
给予
init B
init A
init C
【问题讨论】:
-
那么...你有什么问题?
-
super() 导致调用 MRO 中的下一个方法?
-
是的。您是否检查了您链接的文章中的示例,即fuhm.net/super-harmful/example1-1.py?
-
example1-2中的mro是[E, C, A, D, B, object]。 E 和 C 的 init 方法都有一个 arg,而 A 没有 arg,所以在 A 的 init 方法处抛出异常(
__init__() takes exactly 2 arguments (1 given))。
标签: python object initialization