专栏名称: Python开发者
人生苦短,我用 Python。伯乐在线旗下账号「Python开发者」分享 Python 相关的技术文章、工具资源、精选课程、热点资讯等。
目录
相关文章推荐
51好读  ›  专栏  ›  Python开发者

super 没那么简单

Python开发者  · 公众号  · Python  · 2017-01-26 21:51

正文

请到「今天看啥」查看全文


0x106c49b38 > @ A . add

8


这个结果说明了两个问题:


  1. super().add(m) 确实调用了父类 A 的 add 方法。

  2. super().add(m) 调用父类方法 def add(self, m) 时, 此时父类中 self 并不是父类的实例而是子类的实例, 所以 b.add(2) 之后的结果是 5 而不是 4 。


不知道这个结果是否和你想到一样呢?下面我们来看一个多继承的例子。


多继承


这次我们再定义一个 class C,一个 class D:


class C ( A ) :

def __init__ ( self ) :

self . n = 4

def add ( self , m ) :

print ( 'self is {0} @C.add' . format ( self ))

super (). add ( m )

self . n += 4

class D ( B , C ) :

def __init__ ( self ) :

self . n = 5

def add ( self , m ) :

print ( 'self is {0} @D.add' . format ( self ))

super (). add ( m )

self . n += 5


下面的代码又输出啥呢?


d = D ()

d . add ( 2 )

print ( d . n )


这次的输出如下:


self is __main__ . D object at 0x10ce10e48 > @ D . add

self is __main__ . D object at 0x10ce10e48 > @ B . add

self is __main__ . D object at 0x10ce10e48 > @ C . add

self is __main__ . D object at 0x10ce10e48 > @ A . add

19


你说对了吗?你可能会认为上面代码的输出类似:


self is __main__ . D object at 0x10ce10e48 > @ D . add

self is







请到「今天看啥」查看全文