【问题标题】:what does super really do in python [closed]超级在python中真正做了什么[关闭]
【发布时间】: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


【解决方案1】:

在这两种情况下看起来都像预期的结果......在第一种情况下,C 调用 A(MRO 中的下一个类),它打印“init A”并返回,因此流程返回到 C,它打印“init C”并返回.匹配您的输出。

在第二种情况下,C 调用 A(MRO 中的下一个),它调用 B(MRO 中的 A 旁边)打印“init B”并返回,因此流程返回到 A,该 A 打印“init A”并返回到 C打印“init C”。

【讨论】:

  • 是的,super 非常棘手,正如 Python’s super() considered super! 中所展示的那样。
  • @schemacs: super 并不棘手 - 它调用 mro 中的下一个方法,期间。多重继承很棘手,但这是另一个话题。
猜你喜欢
  • 2020-05-23
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多