__Iter__ объекта Python не вызывается

1

У меня есть класс Python 2.7 (назовите его Child), то есть дочерний элемент другого класса (Parent), который сам по себе является подклассом dict.

Я пытаюсь определить __iter__ в Child в надежде, что когда кто-то сделает dict(child_object) я могу контролировать, как он преобразуется в dict. Я должен что-то недопонимать, потому что кажется, что вызов dict() полностью обходит вызов __iter__ и вместо этого подходит к базовому dict.

Я провел некоторое исследование и с помощью метода dict() docs, я вижу, что он может видеть объект как отображение в первую очередь и, следовательно, использовать это вместо итеративного __iter__. Это так, и если да, то есть способ, которым я могу перезаписать некоторый метод, который вызывается при отображении?

  • 2
    Можете ли вы добавить простой пример к вашему вопросу? Было бы намного легче понять, что вы имеете в виду.
  • 1
    Не наследовать от dict , а от collections.UserDict dict
Показать ещё 1 комментарий
Теги:
object
python-2.7
inheritance

1 ответ

2
Лучший ответ

Когда вы используете dict() для сопоставления (или используете dictionary.update(...) проходящий в сопоставлении), то Python не будет использовать __iter__. Python ищет метод .keys() для обнаружения сопоставлений. В этом случае, если отображение происходит как dict или подкласс dict, то выбирается быстрый путь, который копирует пары ключ-значение непосредственно из лежащих в основе структур C. Вы не можете предотвратить это с помощью пользовательских функций Python.

Иначе говоря, если вы должны определить тип настраиваемого сопоставления, который позволяет вам контролировать, как dict() копирует пары ключ-значение из него, вы не должны подклассифицировать dict. Внедрите свой собственный тип сопоставления путем подклассификации collections.Mapping Сопоставление или collections.MutableMapping UserDict или класс из модуля UserDict.

  • 0
    Спасибо, это подтверждает мои подозрения. Я видел, как в документах UserDict говорилось: «Необходимость в этом классе была в значительной степени вытеснена способностью создавать подклассы непосредственно из dict», поэтому я пошел на диктат.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню