espeed
espeed

Reputation: 4814

Using super() Multiple Times in a Python Class

Why does user.params() not return all the params up the inheritance chain? -- It's not including the params defined in Person() -- notice Vertex() does not have a params() method.


class Element(object):
   def __init__(self,element_type):
        self.oid = None
        self.uuid = uuid.uuid4()
        self.key = None
        self.element_type = element_type

   def params(self):
       return dict(uuid=self.uuid, key=self.key)

class Vertex(Element):
   def __init__(self):
       super(Vertex,self).__init__("vertex")

class Person(Vertex):

   def __init__(self,name=None,uri=None,email=None):
       self.s = super(Person,self)
       self.s.__init__()
       self.name=name
       self.uri=uri
       self.email = email

   def params(self):
       params = dict(name=self.name,uri=self.uri,email=self.email)
       params.update(self.s.params())
       return params

class User(Person):

   def __init__(self,
                name=None,
                uri=None,
                email=None,
                first_name=None,
                last_name=None,
                facebook_id=None,
                facebook_link=None,
                facebook_username=None,
                gender=None,
                locale=None):
       self.s = super(User,self)
       self.s.__init__(name,uri,email)

       self.first_name = first_name
       self.last_name = last_name
       self.facebook_id = facebook_id
       self.facebook_link = facebook_link
       self.facebook_username = facebook_username
       self.gender = gender
       self.locale = locale

   def params(self):
       params = dict(first_name=self.first_name,
                     last_name=self.last_name,
                     facebook_id=self.facebook_id,
                     facebook_link=self.facebook_link,
                     facebook_username=self.facebook_username,
                     gender=self.gender,
                     locale=self.locale)
       print self.s.params()
       params.update(self.s.params())
       return params

Upvotes: 1

Views: 203

Answers (2)

Simon Bergot
Simon Bergot

Reputation: 10582

edit : also the following code works, Sebastians has the correct interpretation: self.s is reassigned each time in the __init__ of the classes. So self.s is reassigned as super(Person,self).

import uuid

class Element(object):
   def __init__(self,element_type):
        self.oid = None
        self.uuid = uuid.uuid4()
        self.key = None
        self.element_type = element_type

   def params(self):
       print 'here Element'
       return dict(uuid=self.uuid, key=self.key)

class Vertex(Element):
   def __init__(self):
       super(Vertex,self).__init__("vertex")

class Person(Vertex):

   def __init__(self,name=None,uri=None,email=None):
       super(Person,self).__init__()
       self.name=name
       self.uri=uri
       self.email = email

   def params(self):
       print 'here Person'
       params = dict(name=self.name,uri=self.uri,email=self.email)
       params.update(super(Person,self).params())
       return params

class User(Person):

   def __init__(self,
                name=None,
                uri=None,
                email=None,
                first_name=None,
                last_name=None,
                facebook_id=None,
                facebook_link=None,
                facebook_username=None,
                gender=None,
                locale=None):
       super(User,self).__init__(name,uri,email)
       self.first_name = first_name
       self.last_name = last_name
       self.facebook_id = facebook_id
       self.facebook_link = facebook_link
       self.facebook_username = facebook_username
       self.gender = gender
       self.locale = locale

   def params(self):
       params = dict(first_name=self.first_name,
                     last_name=self.last_name,
                     facebook_id=self.facebook_id,
                     facebook_link=self.facebook_link,
                     facebook_username=self.facebook_username,
                     gender=self.gender,
                     locale=self.locale)
       print 'here User'
       params.update(super(User, self).params())
       return params

if __name__ == '__main__':
   u = User()
   print '\n'.join(sorted(u.params().keys()))

Upvotes: 1

Sebastian Blask
Sebastian Blask

Reputation: 2938

In User you do:

self.s = super(User,self)
self.s.__init__(name,uri,email)

so self.s is what? As you do the same in Person, self.s is super(Person) and that anywhere, in Person and User as you reassign self.s, so the self.s.params that gets picked is the one of Element.

Upvotes: 2

Related Questions