我刚刚学习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
不同的情况?
答案 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
这是因为虽然NonReturningAdder
和ReturningAdder
同时调用BaseAdder
的{{1}},但foo
会丢弃其返回值,而NonReturningAdder
会通过它上。