8

I have a class that looks like this:

#!/usr/bin/env python
class Foo:
    def __init__(self, x):
        self.x = x
    def bar(self):
        self.bar1_out = self.x + 5
        self.bar2_out = self.x + 1
        return (self.bar1_out,self.bar2_out)
    def qux(self,myvalue = None):
        first, second = myvalue or self.bar()
        return first + 3, second + 6

def main():
    """docstring for main"""
    f = Foo(5)

    mbr_out1, mbr_out2 = f.bar()
    print mbr_out1, "\t", mbr_out2

    mqx_out1, mqx_out2 = f.qux()
    print mqx_out1, "\t", mqx_out2

    qout1, qout2 = f.qux((1))
    print qout1, "\t", qout2

if __name__ == '__main__':
    main()

I saw some implementation that suggest using super

    def __init__(self, x):
        super(Foo,self).__init__()
        self.x = x
    def bar(self)
        #etc.

My questions are:

  1. What's the use of super(Foo,self).__init__()
  2. How does it differ from self.x=x
  3. How can I make my code top above produce the same result by using super()
neversaint
  • 60,904
  • 137
  • 310
  • 477
  • Maybe this helps: http://stackoverflow.com/questions/576169/understanding-python-super-and-init-methods – skamsie Mar 31 '14 at 07:10

1 Answers1

7

How does it differ from self.x=x?

super() is only useful if you subclass:

class Foo(object):
    def __init__(self, x):
        self.x = x

class Bar(Foo):
    def __init__(self, x):
        super(Bar, self).__init__(x)
        self.initial_status = False

is better than setting self.x = x in Bar's __init__.

The difference is that Bar doesn't need to care about the implementation of Foo.

If you choose to change Foo in a way which sets self.x = 2 * x, then you won't have to change Bar as well (which might even sit in a difference file - failure to see this is almost guaranteed).

In your example, there is no point to use super() as you don't subclass.

glglgl
  • 89,107
  • 13
  • 149
  • 217