更新:好的,现在我对这个问题有了更多的了解,我建议选择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的“官方”方式通过引用传递。