下面兩個類定義有什么區(qū)別,class my_dict1(dict): def __init__(self, data): self = data.copy() self.N = sum(self.values)上面的代碼會生成AttributeError: 'dict' object has no attribute 'N',而下面的代碼會編譯class my_dict2(dict): def __init__(self, data): for k, v in data.items(): self[k] = v self.N = sum(self.values)例如,d = {'a': 3, 'b': 5}a = my_dict1(d) # results in attribute errorb = my_dict2(d) # works fine
1 回答

慕無忌1623718
TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個贊
通過將self
自身分配給任何東西,您可以將其分配self
給與最初處理的完全不同的實(shí)例,使其不再是“自我”。該實(shí)例將屬于更廣泛的類型dict
(因?yàn)?code>data是 a?dict
),而不是更窄的類型my_dict1
。您需要self["N"]
在第一個示例中執(zhí)行此操作才能正確解釋它,但請注意,即使這樣,也可以如下所示:
abc?=?mydict_1({})
abc
仍然沒有鍵“N”,因?yàn)橥耆煌膶?shí)例被__init__
賦予了鍵“N”的值。這向您表明,不存在將self
其自身分配給其他事物的合理場景。
關(guān)于my_dict2
,如果您想使用特定的內(nèi)容dict
作為您的域的表示,則更喜歡組合而不是繼承。這意味著有data
一個實(shí)例字段。
添加回答
舉報(bào)
0/150
提交
取消