我有一个生成器函数(newfunc),它通过以下方式从另一个生成器函数(func)生成一个对象(类X):
from contextlib import contextmanager
class X(object):
def __init__(self):
self.state = 'oldstate'
def set_state(self, state):
self.state = state
def get_state(self):
return self.state
xobj1 = X()
xobj2 = X()
@contextmanager
def func(xobj, someVar):
print someVar
yield xobj
@contextmanager
def newfunc():
with func(xobj1, 1) as x1:
with func(xobj2, 2) as x2:
yield x2
x1 = x2 %setting to potentially changed object.
with newfunc() as x:
x.set_state('newstate')
现在,由于x1被设置为x2,我希望xobj1的状态也能反映出'newstate'。但是,只有xobj2的状态设置为“newstate”。这两个对象都不应该被改变吗?具体来说,应该做些什么来确保两者都改变?
答案 0 :(得分:0)
自定义对象的分配操作不会复制或覆盖它们。 x1
和x2
是包含对各自对象的引用的变量。当你写:
x1 = x2
你说:" x1应该引用与x2"相同的对象。您绝不会更改x1
最初引用的对象。如果只想将state
属性从一个对象复制到另一个对象,则需要执行以下操作:
x1.set_state(x2.get_state())
在x1(xobj1)引用的对象上调用set_state
。
等等,对于需要转移的每个属性。为了使其更清晰,您可以在X类中创建一个新方法:
def copy_state(self, other):
self.set_state(other.get_state())
self.set_x(other.get_x())
...
另外,为了使getter和setter更干净,你应该查看属性,这是" clean"在python中制作封装属性的方法。