Я не знаю ни одной подобной функциональности, уже реализованной. Интересная проблема заключается в следующем и требует точных спецификаций относительно того, что должно произойти в этом случае ...:
- процесс A создает объект и отправляет его B, который его расправляет, пока все хорошо
- A вносит изменения X в объект, в то время как B меняет Y на его копию объекта
- теперь любой процесс отправляет свой объект другому, который его распаковывает: что меняется
объект должен быть виден в это время в каждом процессе ? это имеет значение
отправляет ли A на B или наоборот, т. е. «владеет» ли объект? или что?
Если вам все равно, скажем, потому что только СОБСТВЕННО для объекта - только А когда-либо разрешено вносить изменения и отправлять объект другим, другие не могут и не будут меняться - тогда проблемы сводятся к чтобы идентифицировать obj однозначно - подойдет GUID. Класс может поддерживать атрибуты дикта класса, отображающие идентификаторы GUID для существующих экземпляров (вероятно, в качестве слабо значимого диктанта, позволяющего избежать ненужного поддержания экземпляров в живых, но это является побочной проблемой), и при необходимости возвращать существующий экземпляр.
Но если изменения должны быть синхронизированы с какой-либо более тонкой гранулярностью, то внезапно это ДЕЙСТВИТЕЛЬНО трудная проблема распределенных вычислений, и спецификации того, что происходит, в каких случаях действительно нужно прибегать с предельной осторожностью (и с большей паранойей, чем есть). присутствует в большинстве из нас - распределенное программирование ОЧЕНЬ сложно, если только несколько простых и доказуемо правильных шаблонов и идиом не соблюдаются фанатично! -).
Если вы можете придумать спецификации для нас, я могу предложить набросок того, как бы я попытался их встретить. Но я не позволю себе угадать спецификации от вашего имени; -).
Редактировать : ОП уточнил, и, похоже, все, что ему нужно, это лучшее понимание того, как контролировать __new__
. Это просто: см. __getnewargs__
- вам понадобится класс нового стиля и травление с протоколом 2 или лучше (но это рекомендуется в любом случае по другим причинам! -), затем __getnewargs__
в существующий объект может просто вернуть GUID объекта (который __new__
должен получить в качестве необязательного параметра). Так что __new__
может проверить, присутствует ли GUID в классе memo
[[слабое значение ;-)]] (и если да, вернуть соответствующее значение объекта) - если нет (или если GUID не передан, подразумевая, что это не удаление, поэтому необходимо сгенерировать новый GUID), затем создать действительно новый объект (установив его GUID ;-), а также записать его на уровне класса memo
.
Кстати, для создания GUID рассмотрите возможность использования модуля uuid в стандартной библиотеке.