簡體   English   中英

在 OrderedDict 子類中覆蓋沒有 super() 的 __init__ 但父構造函數仍然有效

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

編輯:根據這個答案,調用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__()則需要調用super().__init__() ) 。 您沒有使用該功能,因此不調用它也無妨。 當然其他方法也有效; 他們為什么不呢? 字典存在,它只是空的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM