Python嵌套生成器函数:外部函数不反映obj中的更改

2024-10-03 00:21:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 对象函数selfdefaswithfuncstate
1条回答
网友
1楼 · 发布于 2024-10-03 00:21:28

对自定义对象的指定操作不会复制或覆盖它们。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更干净,您应该研究属性,这是python中生成封装属性的“干净”方式。你知道吗

相关问题 更多 >