在OrderedDict子类中重写不带super()的__init__,但父构造函数仍然有效



EDIT:根据这个答案,调用super()是个好主意,因为否则行为可能未定义。在这种情况下,我想我的问题是,即使不调用代码,我的代码是如何工作的?这看起来就像一个电灯开关在没有人接通电源的情况下工作。因此,我更感兴趣的是正在发生的事情的机制,而不是简单的"是的,添加它"或"否,没有必要"。

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

根据这个答案,我应该打电话给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

OrderedDict基于C代码,其中初始化底层数据结构的重任是在对象构造期间完成的,在__init__之前。碰巧__init__在这种情况下只关心如何处理初始化参数。如果您不需要该功能,可以跳过调用super。。。。如果超类改变了它在__init__中的作用,那么就有可能在以后的某个地方引入错误。

如果您想要dict初始化器提供的功能(从另一个字典或键值对序列初始化字典(,则需要调用super().__init__()。你没有使用这个功能,所以不调用它也无妨。当然,其他方法也可以;他们为什么不呢?字典是存在的,只是空的。

相关内容

最新更新