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

Popular posts from this blog

python - Scipy curvefit RuntimeError:Optimal parameters not found: Number of calls to function has reached maxfev = 1000 -

java - where to store the user credentials in an enterprise application(EAI)? -

java - netbeans "Please wait - classpath scanning in progress..." -