在 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
以支持缓存方法,即 get
和 put
。它工作得很好,但我很困惑——为什么我不需要调用父级的构造函数?
根据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__
中的功能,则可能会在某处引入错误.
编辑:根据this answer,调用super()
是好主意,否则行为可能未定义。我想在那种情况下我的问题确实是,即使没有调用我的代码如何工作?这看起来就像一个电灯开关,无需任何人接电即可工作。所以我对正在发生的事情的机制更感兴趣,而不是简单的 "yes add it" 或 "no it's not necessary"。
我正在使用以下 python 代码来实现 LRU 缓存。它继承 OrderedDict
以支持缓存方法,即 get
和 put
。它工作得很好,但我很困惑——为什么我不需要调用父级的构造函数?
根据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__
中的功能,则可能会在某处引入错误.