python - 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”。两个对象不应该都被改变了吗?具体来说,应该做些什么来确保两者都发生变化?
解决方案
自定义对象的赋值操作不会复制或覆盖它们。x1
并且x2
是包含对其各自对象的引用的变量。当你写:
x1 = x2
您是在说:“x1 应该与 x2 引用相同的对象”。您绝不会更改最初引用的对象x1
。如果您只想将state
属性从一个对象复制到另一个对象,则需要执行以下操作:
x1.set_state(x2.get_state())
它调用set_state
x1 (xobj1) 引用的对象。
依此类推,对于需要传输的每个属性。为了让它更简洁,你可以在类 X 中创建一个新方法:
def copy_state(self, other):
self.set_state(other.get_state())
self.set_x(other.get_x())
...
此外,为了使 getter 和 setter 更干净,您应该查看属性,这是 python 中用于制作封装属性的“干净”方式。
推荐阅读
- sql - oracle特定表下创建用户
- html - 如何在单击 Jquery Datatable 的按钮时获取行值
- c - 求平均值后如何显示增量?
- javascript - (React.js)使用Webpack从一个文件夹中导入多个图像后损坏的图像
- sql - 将表创建为选择时传递的约束
- sql - 从连接表中选择最大列
- java - 如何导入 .ipr 文件以使用 Intellij IDEA 配置 Apache Kafka?
- mysql - 恢复 MySQL innoDB 转储的更快方法
- c - C - 到/从 OpenMP 结构化块的无效分支
- java - 为什么 gradle 不能解决这个完全限定的依赖变体?