class - Python super method and calling alternatives -
i see everywhere examples super-class methods should called by:
super(superclass, instance).method(args) is there disadvantage doing:
superclass.method(instance, args)
consider following situation:
class a(object): def __init__(self): print('running a.__init__') super(a,self).__init__() class b(a): def __init__(self): print('running b.__init__') # super(b,self).__init__() a.__init__(self) class c(a): def __init__(self): print('running c.__init__') super(c,self).__init__() class d(b,c): def __init__(self): print('running d.__init__') super(d,self).__init__() foo=d() so classes form so-called inheritance diamond:
/ \ b c \ / d running code yields
running d.__init__ running b.__init__ running a.__init__ that's bad because c's __init__ skipped. reason because b's __init__ calls a's __init__ directly.
the purpose of super resolve inheritance diamonds. if un-comment
# super(b,self).__init__() and comment-out
a.__init__(self) the code yields more desireable result:
running d.__init__ running b.__init__ running c.__init__ running a.__init__ now __init__ methods called. notice @ time define b.__init__ might think super(b,self).__init__() same calling a.__init__(self), you'd wrong. in above situation, super(b,self).__init__() calls c.__init__(self).
holy smokes, b knows nothing c, , yet super(b,self) knows call c's __init__? reason because self.__class__.mro() contains c. in other words, self (or in above, foo) knows c.
so careful -- 2 not fungible. can yield vastly different results.
using super has pitfalls. takes considerable level of coordination between classes in inheritance diagram. (they must, example, either have same call signature __init__, since particular __init__ not know other __init__ super might call next, or else use **kwargs.) furthermore, must consistent using super everywhere. skip once (as in above example) , defeat entire purpose of super. see link more pitfalls.
if have full control on class hierarchy, or avoid inheritance diamonds, there no need super.
Comments
Post a Comment