在 OrderedDict 子类中不使用 super() 覆盖 __init__ 但父构造函数仍然有效

Overwriting __init__ without super() in OrderedDict subclass but parent constructor still works

编辑:根据this answer,调用super()好主意,否则行为可能未定义。我想在那种情况下我的问题确实是,即使没有调用我的代码如何工作?这看起来就像一个电灯开关,无需任何人接电即可工作。所以我对正在发生的事情的机制更感兴趣,而不是简单的 "yes add it" 或 "no it's not necessary"。

我正在使用以下 python 代码来实现 LRU 缓存。它继承 OrderedDict 以支持缓存方法,即 getput。它工作得很好,但我很困惑——为什么我不需要调用父级的构造函数?

根据this answer,我应该调用super().__init__(),但我没有(自己试试)。

我的问题是,如果什么都没有初始化,我的子类通过什么机制知道如何向自身插入值?

from collections import OrderedDict

class LRUCache(OrderedDict):
    def __init__(self, capacity):
        self.capacity = capacity

    def get(self, key):
        if key not in self:
            return -1
        self.move_to_end(key)
        return self[key]

    def put(self, key, value):
        if key in self:
            self.move_to_end(key)
        elif len(self) == self.capacity:
            self.popitem(last=False)
        self[key] = value

如果您想要 dict 初始化程序提供的功能(从另一个字典或一系列键值对初始化字典),您需要调用 super().__init__()。您没有使用该功能,因此不调用它没有坏处。当然,其他方法也有效;他们为什么不呢?字典存在,它只是空的。

OrderedDict 基于 C 代码,其中初始化底层数据结构的繁重工作是在 __init__ 之前的对象构造期间完成的。碰巧 __init__ 在这种情况下只关心如何处理初始化参数。如果您不需要该功能,则可以跳过调用 super .... 如果超级 class 更改了它在 __init__ 中的功能,则可能会在某处引入错误.