__Iter__ объекта Python не вызывается - PullRequest
0 голосов
/ 16 октября 2018

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

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

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

1 Ответ

0 голосов
/ 16 октября 2018

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

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

...