1

下面的两个类定义有什么区别,

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 error
b = my_dict2(d) # works fine
4

1 回答 1

2

通过将self自己分配给您分配给与self您最初处理的完全不同的实例的任何内容,使其不再是“自我”。这个实例将是更广泛的类型dict(因为data是 a dict),而不是更窄的类型my_dict1。您需要self["N"]在第一个示例中执行此操作才能正确解释它,但请注意,即使这样,类似:

abc = mydict_1({})

abc仍然没有键“N”,因为一个完全不同的实例__init__被赋予了键“N”的值。这向您表明,没有合理的场景要将自己分配self给其他东西。

关于my_dict2,如果您想使用特定dict作为域的表示,则更喜欢组合而不是继承。这意味着具有data作为实例字段。请参阅相关的 C# 问题为什么不从 List 继承?,核心答案还是一样的。归结为您是否要扩展dict机制与基于它的业务对象。

于 2020-09-06T00:43:54.203 回答