Python嵌套生成器函数:外部函数不反映对象的变化

时间:2018-04-26 09:28:21

标签: python python-2.7 generator

我有一个生成器函数(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”。这两个对象都不应该被改变吗?具体来说,应该做些什么来确保两者都改变​​?

1 个答案:

答案 0 :(得分:0)

自定义对象的分配操作不会复制或覆盖它们。 x1x2是包含对各自对象的引用的变量。当你写:

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中制作封装属性的方法。