15

私は今、python OOPについて学んでいます。一部のフレームワークのソース コードで、return super(...この 2 つに違いがあるのではないかと思いました。

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)

2 つのインスタンスがあるとします。

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

を呼び出すfooa、何も起こらないように見えます。

>>> a.add(3, 5)

ただし、を呼び出すfooと、期待どおりの結果が得られます。b

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

これは、 whileNonReturningAdderReturningAddercallBaseAdderfoo,の両方NonReturningAdderが戻り値を破棄し、それReturningAdderを渡すためです。

于 2013-09-06T03:21:45.490 に答える