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