У меня есть класс Python 2.7 (назовите его Child), то есть дочерний элемент другого класса (Parent), который сам по себе является подклассом dict.
Я пытаюсь определить __iter__
в Child в надежде, что когда кто-то сделает dict(child_object)
я могу контролировать, как он преобразуется в dict. Я должен что-то недопонимать, потому что кажется, что вызов dict() полностью обходит вызов __iter__
и вместо этого подходит к базовому dict.
Я провел некоторое исследование и с помощью метода dict() docs, я вижу, что он может видеть объект как отображение в первую очередь и, следовательно, использовать это вместо итеративного __iter__
. Это так, и если да, то есть способ, которым я могу перезаписать некоторый метод, который вызывается при отображении?
Когда вы используете dict()
для сопоставления (или используете dictionary.update(...)
проходящий в сопоставлении), то Python не будет использовать __iter__
. Python ищет метод .keys()
для обнаружения сопоставлений. В этом случае, если отображение происходит как dict
или подкласс dict, то выбирается быстрый путь, который копирует пары ключ-значение непосредственно из лежащих в основе структур C. Вы не можете предотвратить это с помощью пользовательских функций Python.
Иначе говоря, если вы должны определить тип настраиваемого сопоставления, который позволяет вам контролировать, как dict()
копирует пары ключ-значение из него, вы не должны подклассифицировать dict
. Внедрите свой собственный тип сопоставления путем подклассификации collections.Mapping
Сопоставление или collections.MutableMapping
UserDict
или класс из модуля UserDict
.
dict
, а отcollections.UserDict
dict