python 在将列表传递给方法时使用惰性赋值

标签 python generator

我有一个 python 类 A 及其子类 B。我创建了一个类 B 的对象,传递了一些列表类型的参数,这些参数附加在 B 中,结果存储在类 A 中。我希望能够更改一个那些最初的论点,并立即看到变化反射(reflect)出来。让我用一个例子来解释:

class A():
    def __init__(self,data):
        self.a=data

class B(A):
    def __init__(self,x,y):
        self.x=x
        self.y=y
        A.__init__(self,self.x+self.y)

    def change_x(self,x):
        self.x = x

现在,我跑

test = B([1, 2], [3,4])
print(test.a)

我显然得到 [1,2,3,4]。如果我按如下方式更改列表的一部分:

test.change_x([3,4])
print(test.a)

我想得到 [3,4,3,4],而不是当然,我收到 [1,2,3,4]。当然,test.a 仅在实例化期间进行评估。

我理解为什么情况并非如此,并且我阅读了有关生成器的内容,但没有弄清楚如何实现它。我不想以只能迭代一次的迭代结束。

谁能帮帮我?解决这个问题的干净方法?

最佳答案

是否有理由拥有 A 类?您可以创建一个属性或方法 a 来返回您在类 B 中想要的内容。

class B():
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def change_x(self, x):
        self.x = x

    @property
    def a(self):
        return self.x + self.y


test = B([1, 2], [3, 4])
print(test.a)  # [1, 2, 3, 4]

test.change_x([3, 4])
print(test.a)  # [3, 4, 3, 4]

小提示:对于这个实现,change_x 方法应该不是必需的。直接访问属性(例如 test.x = x)通常比使用 getter 和 setter 更符合 Pythonic。

关于python 在将列表传递给方法时使用惰性赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39068974/

相关文章:

python - 从 python 脚本上传文件到我的 Dropbox

python - 我的代码有什么问题,返回空图?

python - 如何将句子拆分成相关的词(术语提取)?

generator - 有推荐的接受 Markdown 文档的静态站点生成器吗?

python - 如何将列表转换为生成器?

python - Fastapi/Tortoise 早期模型初始化

python - 仅在带有特定文本的标签之后查找特定类别的所有标签

python - 如何在生成器表达式中执行临时赋值?

Python - 如何更简洁地使用生成器?

python - 如何从Python生成器对象获取源行号?