15

我刚刚学习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

4

1 回答 1

20

是的。考虑这种情况,超类不仅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()

当我们调用fooa,似乎什么也没发生:

>>> a.add(3, 5)

然而,当我们调用foob,我们得到了预期的结果:

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

那是因为 whileNonReturningAdderReturningAddercallBaseAdder都丢弃了它的返回值,而foo将它传递给了它。NonReturningAdderReturningAdder

于 2013-09-06T03:21:45.490 回答