demystify super in python?

戏子无情 提交于 2019-12-06 07:04:57

问题


I was trying to understand how super works in python and tried the following example:

class A(object):
    def __init__(self):
        print "in A's init"

class B(object):
    def __init__(self):
        print "in B's init"

class C(A,B):
    def __init__(self):
        super(C,self).__init__()
        print "In C"

if __name__=="__main__":
    c=C()

fairly simple.. And I tried the following super calls(displayed with the results here):

>>> super(B,c).__init__()
>>> super(B,c).__init__()
>>> super(A,c).__init__()
    in B's init
>>> super(A,c).__init__()
    in B's init
>>> super(A,c).__init__()
    in B's init
>>> super(B,c).__init__()
>>> super(C,c).__init__()
    in A's init

I do not understand why does super(A,c).__init__() print out that its in B's init??


回答1:


Python's super() should have been been called "next-in-mro" because it doesn't necessarily call upwards to a parent; rather, it can call a sibling instead.

It is easy to inspect the method resolution order of your class structure:

 >>> C.__mro__
 (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <type 'object'>)

You can see that B is the next class after A.

The reason for this design is that it lets the chain of super calls visit every class in the chain no more than once. That supports a style of programming called "cooperative multiple inheritance" which is sometimes very useful.

Here are some references including links to Dylan's next-method that served as a model for Python's super():

  • http://opendylan.org/books/drm/Method_Dispatch#HEADING-50-32
  • http://rhettinger.wordpress.com/2011/05/26/super-considered-super/
  • http://opendylan.org/proposals/dep-0003.html
  • http://www.artima.com/weblogs/viewpost.jsp?thread=281127


来源:https://stackoverflow.com/questions/24564908/demystify-super-in-python

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!