Пересечение стиля иерархии объектов - PullRequest
1 голос
/ 04 мая 2011

Мне нужна какая-то обработка объектов, которые травятся непосредственно перед тем, как это произойдет.Точнее для экземпляров подклассов определенного базового класса, я хотел бы, чтобы вместо загрузки было что-то совершенно другое, а затем воссоздано при загрузке.

Мне известно о __getstate__ & __setstate__, однако это оченьинвазивный подход.Насколько я понимаю, это частные методы (начинаются с двойного подчеркивания: __) и как таковые могут быть искажены.Следовательно, это фактически заставило бы меня переопределить эти два метода для каждого отдельного класса, к которому я хочу применить это нестандартное поведение.Кроме того, я не имею полного контроля над иерархией всех классов.

Мне было интересно, есть ли какой-то краткий способ подключиться к процессу засолки и применить такой контроль, который __getstate__и __setstate__ дают, но без необходимости изменять маринованные классы как таковые.

Примечание для любопытных.Этот пример использования взят из проекта с использованием Django и Celery.Модели Django либо непроницаемы, либо очень непрактичны и громоздки для маринования.Поэтому гораздо полезнее вместо этого выбирать пары значений ID + класс модели.Однако иногда травится не модель, а словарь моделей, список моделей, список списков моделей, вы называете это.Это заставляет меня писать много кода для копирования и вставки, который мне действительно не нравится.Необходимость выбора моделей возникает сама по себе из установки Django-сельдерея, где функции вместе с аргументами вызова запланированы для последующего выполнения.К сожалению, среди этих аргументов обычно есть много моделей, смешанных в некоторой нетривиальной иерархии.

РЕДАКТИРОВАТЬ

У меня есть возможность указать используемый сериализатор, который будет использоватьсяCelery, так что на самом деле вопрос заключается в том, чтобы без особых усилий построить слегка модифицированный сериализатор на вершине рассола.

1 Ответ

2 голосов
/ 04 мая 2011

Единственными связанными дополнительными хуками являются lower () и __reduce__ex ()

http://docs.python.org/library/pickle.html

В чем разница между __reduce__ и __reduce_ex__?

Python: Обеспечение того, чтобы мой класс был засорен только последним протоколом

Не уверен, действительно ли они предоставляют то, что вам нужно.

...