首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`super(...)`和` `return super(...)`有什么区别?

`super(...)`和` `return super(...)`有什么区别?
EN

Stack Overflow用户
提问于 2013-09-06 11:19:19
回答 1查看 10.4K关注 0票数 14

我刚刚开始学习python面向对象编程。在一些框架的源代码中,我偶然发现了return super(...,我想知道这两者之间是否有区别。

代码语言:javascript
复制
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不同的情况

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-06 11:21:45

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

代码语言:javascript
复制
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)

假设有两个实例:

代码语言:javascript
复制
>>> a = NonReturningAdder()
>>> b = ReturningAdder()

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

代码语言:javascript
复制
>>> a.add(3, 5)

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

代码语言:javascript
复制
>>> b.add(3, 5)
8

这是因为当NonReturningAdderReturningAdder都调用BaseAdderfoo时,NonReturningAdder会丢弃返回值,而ReturningAdder会传递返回值。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18649348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档