【问题标题】:What is the difference between `super(...)` and `return super(...)`?`super(...)` 和 `return super(...)` 有什么区别?
【发布时间】:2013-09-06 03:19:19
【问题描述】:

我刚刚开始学习 python OOP。在某些框架的源代码中,我遇到了return super(...,想知道两者之间是否有区别。

class a(object):
    def foo(self):
        print 'a'

class b(object):
    def foo(self):
        print 'b'

class A(a):
    def foo(self):
        super(A, self).foo()

class B(b):
    def foo(self):
        return super(B, self).foo()

>>> aie = A(); bee = B()
>>> aie.foo(); bee.foo()
a
b

在我看来是一样的。我知道如果你允许,OOP 会变得非常复杂,但是在我学习的这一点上,我没有足够的资金来提出一个更复杂的例子。是否存在返回super 与调用super 不同的情况?

【问题讨论】:

  • "x"return "x"有什么区别?

标签: python oop


【解决方案1】:

是的。考虑这种情况,超类的foo 不仅仅是打印,而是返回了一些东西:

class BaseAdder(object):
    def add(self, a, b):
        return a + b

class NonReturningAdder(BaseAdder):
    def add(self, a, b):
        super(NonReturningAdder, self).add(a, b)

class ReturningAdder(BaseAdder):
    def add(self, a, b):
        return super(ReturningAdder, self).add(a, b)

给定两个实例:

>>> a = NonReturningAdder()
>>> b = ReturningAdder()

当我们在a 上调用foo 时,似乎什么也没发生:

>>> a.add(3, 5)

然而,当我们在b 上调用foo 时,我们得到了预期的结果:

>>> b.add(3, 5)
8

这是因为NonReturningAdderReturningAdder 都调用了BaseAdderfooNonReturningAdder 丢弃了它的返回值,而ReturningAdder 传递了它。

【讨论】:

  • 哦!我正在阅读这个博客,它给我的印象是super 是一些 python 魔法——用“旧样式”来解决继承问题。感谢您回答我的愚蠢问题。
  • @Noob:是的,super 确实在确定要调用什么方面发挥了一些作用,但是一旦它调用了其他方法,它就会像你期望的那样工作。
  • super不带return有什么用?
  • @MichaelD 一个很好的例子是super().__init__(),它可以设置或修改实例属性,但__init__不应该有返回值。这同样适用于任何修改属性但不返回任何内容(或不需要返回值)的用户定义方法。
猜你喜欢
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 2017-07-13
  • 2018-11-05
  • 2017-05-23
相关资源
最近更新 更多