Обновление : Хорошо, теперь, когда я больше понимаю проблему, я бы предложил комбинацию вариантов 1 и 4: создать общедоступные методы update()
и dictify()
. Эти могут быть обертками вокруг варианта 4 или некоторого варианта, например myObj.__dict__.update(modObj.__dict__)
, оба из которых несколько хакерские.
Или это могут быть элегантные, читаемые, самодокументируемые методы, которые принимают и возвращают (соответственно) соответствующее словарное представление self
, которое может совпадать или не совпадать с self.__dict__
. Я думаю, что причина того, что Python не имеет никакой встроенной функциональности для подобных вещей, заключается в том, что не существует по-настоящему общего способа его реализации, потому что не все объекты имеют __dict__
. Этот тип поведения имеет для настраиваемой реализации.
Если манипулирования __dict__
достаточно для ваших нужд, хорошо, но вы избавите себя от некоторых неприятностей, если скрываете эти манипуляции за абстракцией, которую можно изменить позже, если решите, что хотите реализовать __slots__
или что-то подобное .
(оставляя ниже для исторических целей)
Это смущает меня: «Я не хочу возвращать измененный объект (потому что многопроцессорная обработка может или не может быть задействована)». Если вы имеете в виду модуль multiprocessing
, то даже параметры 0 и 3 не будут выполнены, поскольку процессы не разделяют память.
>>> for i in range(4):
... temp = MyClass()
... p = Process(target=myFunc, args=(temp, i))
... p.start()
... p.join()
... print i,temp.x
...
0 construct
1 construct
2 construct
3 construct
См? Если вы хотите передавать данные между процессами, вы должны использовать один из встроенных типов multiprocessing
.
>>> from multiprocessing import Process, Queue
>>>
>>> def myFuncQ(myObj, i, return_queue):
... myObj.x = 'start'
... modObj = deepcopy(myObj)
... modObj.x = 'modified'
... return_queue.put(modObj)
...
>>> return_queue = Queue()
>>> for i in range(4):
... temp = MyClass()
... p = Process(target=myFuncQ, args=(temp, i, return_queue))
... p.start()
... p.join()
... temp = return_queue.get()
... print i,temp.x
...
0 modified
1 modified
2 modified
3 modified
Если вы не используете multiprocessing
, тогда Queue
будет служить, как и любой другой изменяемый контейнер для этой цели. Это самый близкий к "официальному" способ передачи по ссылке в Python.