Let's say I have the following classes set up:
class Foo:      def __init__(self, frob, frotz):           self.frobnicate = frob           self.frotz = frotz class Bar:      def __init__(self, frob, frizzle):           self.frobnicate = frob           self.frotz = 34           self.frazzle = frizzle   How can I (if I can at all) use super() in this context to eliminate the duplicate code?
Example 1: super() with Single InheritanceIn the case of single inheritance, we use super() to refer to the base class. Dog has four legs. Dog is a warm-blooded animal. Since we do not need to specify the name of the base class when we call its members, we can easily change the base class name (if we need to).
The super() function is used to give access to methods and properties of a parent or sibling class. The super() function returns an object that represents the parent class.
In python single inheritance, a derived class is derived only from a single parent class and allows the class to derive behaviour and properties from a single base class. This enables code reusability of a parent class, and adding new features to a class makes code more readable, elegant and less redundant.
The super() in Java is a reference variable that is used to refer parent class constructors. super can be used to call parent class' variables and methods. super() can be used to call parent class' constructors only.
Assuming you want class Bar to set the value 34 within its constructor, this would work:
class Foo(object):      def __init__(self, frob, frotz):           self.frobnicate = frob           self.frotz = frotz  class Bar(Foo):      def __init__(self, frob, frizzle):           super(Bar, self).__init__(frob, frizzle)           self.frotz = 34           self.frazzle = frizzle   bar = Bar(1,2) print "frobnicate:", bar.frobnicate print "frotz:", bar.frotz print "frazzle:", bar.frazzle   However, super introduces its own complications. See e.g. super considered harmful. For completeness, here's the equivalent version without super.
class Foo(object):      def __init__(self, frob, frotz):           self.frobnicate = frob           self.frotz = frotz  class Bar(Foo):      def __init__(self, frob, frizzle):           Foo.__init__(self, frob, frizzle)           self.frotz = 34           self.frazzle = frizzle   bar = Bar(1,2) print "frobnicate:", bar.frobnicate print "frotz:", bar.frotz print "frazzle:", bar.frazzle 
                        In Python >=3.0, like this:
class Foo():     def __init__(self, frob, frotz)         self.frobnicate = frob         self.frotz = frotz  class Bar(Foo):     def __init__(self, frob, frizzle)         super().__init__(frob, 34)         self.frazzle = frizzle   Read more here: http://docs.python.org/3.1/library/functions.html#super
EDIT: As said in another answer, sometimes just using Foo.__init__(self, frob, 34) can be the better solution. (For instance, when working with certain forms of multiple inheritance.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With