2011-04-14 59 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的一個。

相關問題