2013-08-20 38 views
2

我有這樣的代碼:的Python:類和子類的問題

class main(): 
    params = {} 


class a(main): 
    def __init__(self): 
     self.params['test'] = "111aa" 
     print self.params 

class b(main): 
    def __init__(self): 
     self.params['be'] = "222bbb" 
     print self.params 

a() 
#{'test': '111aa'} 

b() 
#{'test': '111aa', 'be': '222bbb'} 

我從B只需要{'be': '222bbb'} 打印有什麼辦法怎麼辦呢?

感謝

+1

'params'是一個類屬性。你想要一個實例屬性。在'main .__ init__'中設置'self.params',並記住在子類構造函數中調用超類構造函數。 – user2357112

+0

你真的想在'main'的子類之間共享'params'嗎? – alecxe

+0

alecxe:是的,我需要分享它; user2357112:謝謝! – Peter

回答

6

試試這個:

class main(object): # use new-style classes! 
    def __init__(self): 
     self.params = {} 

class a(main): 
    def __init__(self): 
     super(a, self).__init__() 
     self.params['test'] = "111aa" 
     print self.params 

class b(main): 
    def __init__(self): 
     super(b, self).__init__() 
     self.params['be'] = "222bbb" 
     print self.params 

注意,在你的代碼params被定義爲屬性。通過在超類的__init__中定義它,我們表明它是一個實例屬性。另請注意,子類在超類上調用__init__

通過這種方式,我們確保每個實例都有自己的params屬性,而不共享它。你不能指望在實例之間共享一個對象,並且爲每個實例分配不同的值,這是一個矛盾。

+1

這是一個很好的答案和對問題的很好的解釋。我唯一的建議是使用'super()'調用'main'的'__init__'方法,而不是明確指定超類。這是因爲'super'支持多重繼承,否則很難或不可能。 – Blckknght

+0

@Blckknght好建議,我編輯了我的答案。謝謝! –