EDIT:根据这个答案,调用super()
是个好主意,因为否则行为可能未定义。在这种情况下,我想我的问题是,即使不调用代码,我的代码是如何工作的?这看起来就像一个电灯开关在没有人接通电源的情况下工作。因此,我更感兴趣的是正在发生的事情的机制,而不是简单的"是的,添加它"或"否,没有必要"。
我正在使用以下python代码来实现LRU缓存。它对OrderedDict
进行了子类化,以支持缓存的方法,即get
和put
。它工作得很好,但我很困惑——为什么我不需要调用父级的构造函数呢?
根据这个答案,我应该打电话给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__()
。你没有使用这个功能,所以不调用它也无妨。当然,其他方法也可以;他们为什么不呢?字典是存在的,只是空的。