1

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 
7
  • 2
    1. That's not MI. 2. What are you trying to do in Person.__init__() and User.__init__()? Commented Apr 14, 2011 at 16:46
  • User's init method calls Person's init method via super() so that it has access to Person's methods and attributes. Person's init method calls Vertex's init method via super() in the same way. Commented Apr 14, 2011 at 16:58
  • No it doesn't. It puts a super proxy in an attribute and then calls a method on that. Commented Apr 14, 2011 at 16:59
  • What should I do instead? self.s is used again in params() Commented Apr 14, 2011 at 17:00
  • The same thing you did in Vertex.__init__(). Unless it doesn't make sense to do the same thing, in which case you quite seriously need to reconsider using inheritance there. Commented Apr 14, 2011 at 17:03

2 Answers 2

2

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.

Sign up to request clarification or add additional context in comments.

Comments

1

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())) 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.