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

时间:2013-09-06 03:19:19

标签: python oop

我刚刚学习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不同的情况?

1 个答案:

答案 0 :(得分:16)

是。考虑以下情况:超级类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()

当我们在foo上致电a时,似乎没有任何反应:

>>> a.add(3, 5)

但是,当我们在foo上致电b时,我们会得到预期的结果:

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

这是因为虽然NonReturningAdderReturningAdder同时调用BaseAdder的{​​{1}},但foo会丢弃其返回值,而NonReturningAdder会通过它上。