2011-04-14 64 views
1

为什么user.params()不会将所有参数都返回到继承 链? - 它不包括Person()中定义的参数 - 通知 Vertex()没有params()方法。在Python类中多次使用super()


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 

+2

1.那不是MI。 2. **你在'Person .__ init __()'和'User .__ init __()'中要做什么**? – 2011-04-14 16:46:36

+0

用户的__init__方法通过super()调用Person的__init__方法,以便它可以访问Person的方法和属性。 Person的__init__方法以相同的方式通过super()调用Vertex的__init__方法。 – espeed 2011-04-14 16:58:17

+0

不,它不。它在一个属性中放置一个'super'代理,然后调用一个方法。 – 2011-04-14 16:59:08

回答

1

编辑:也是下面的代码的作品,塞巴斯蒂安有正确的解释:self.s每次重新分配在类的__init__。所以self.s被重新分配为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())) 
2

在用户这样做:

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

所以self.s是什么?就像你在Person中做同样的事情,self.s是超级(Person),并且在你重新指派self.s的任何地方,在Person和User中,所以被选中的self.s.params是Element的一个。

相关问题