Перезапись __init__ без super () в подклассе OrderedDict, но родительский конструктор все еще работает - PullRequest
0 голосов
/ 26 февраля 2020

РЕДАКТИРОВАТЬ: Согласно этот ответ , хорошая идея для вызова 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

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

OrderedDict основан на C коде, где тяжелая работа по инициализации базовых структур данных выполняется во время построения объекта до __init__. Бывает, что __init__ в этом случае касается только того, как обрабатываются параметры инициализации. Если вам не нужна эта функциональность, вы можете пропустить вызов super .... с риском внесения ошибок где-нибудь в будущем, если суперкласс изменит то, что он делает в __init__.

0 голосов
/ 26 февраля 2020

Вам нужно вызвать super().__init__(), если вы хотите использовать функциональность, предоставляемую инициализатором dict (инициализация словаря из другого словаря или последовательности пар ключ-значение). Вы не используете эту функциональность, так что не стоит ее называть. Конечно, другие методы работают; почему бы и нет? Словарь существует, он просто пустой.

...