2014-11-22 63 views
0

我不明白如何改變類型從列表到字典中的構造函數如果我有子類另一種類型 - 字典。改變超類的類型

這是什麼魔術?

class Adder: 
def __init__(self, data = [ ]): 
    self.data = data 
def __add__(self, other): 
    return "Not Implemented" 



class DictAdder(Adder): 
    def __add__(self, y): 
     z = {} 
     for k in self.data.keys(): z[k] = self.data[k] 
     for k in y.keys(): z[k] = y[k] 
     return z 




y = DictAdder({1:'a', 2:'b'}) 
l = y + { 3: 'c', 4: 'd'} 
print(l) 

和答案:

{1: 'a', 2: 'b', 3: 'c', 4: 'd'} 

Pycharm顯示什麼self.data.keys()不具有屬性鍵(),這必須是嘗試,因爲數據是一個列表,但這是工作

+0

變量在Python中沒有類型。一個變量可以用來指向任何類型的對象:'x = 1; x = []; x ='foo''。 – 2014-11-22 21:21:07

+1

同樣[不使用可變默認參數(http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument),否則你可能最終發佈的另一個問題等一下。 :-) – 2014-11-22 21:23:50

回答

0

data默認值列表,但Python不是靜態類型語言,因此它不一定是。 data只是一個名字。僅僅因爲我們有這個:

class Adder: 
    def __init__(self, data = [ ]): 
     self.data = data 

不限制我們的使用。我仍然可以做:

i = Adder(4) 
s = Adder('hello') 
d = Adder({1: 2}) 
o = Adder(SomeOtherType()) 

只要力所能及使用Adder.data正確地使用它恰好是類型。因爲在這種情況下,DictAdderdata解釋爲dict,並且它工作正常。當然,如果您嘗試使用由非dict構造的DictAdder,則會出現錯誤。

+0

是的,我有錯誤,如果得到列表或其他類型的DictAdder。但是,這是我寫的很好的解決方案?還是有另一種解決方案? – 2014-11-22 21:19:53

+1

@VladPakin什麼? – Barry 2014-11-22 21:22:08