在不可变对象中修改可变对象的pythonic方法

Posted

技术标签:

【中文标题】在不可变对象中修改可变对象的pythonic方法【英文标题】:pythonic way of modifying a mutable inside an immutable 【发布时间】:2010-12-29 05:51:48 【问题描述】:

假设我有一个类对外部世界表现为一个 int,但实际上它是一个可变对象,在多个结构中具有固定位置。如果 n 是我的对象,我现在可以通过写 n.update(34) 来更新它,但我发现我总是想改写 n = 34。我浏览了http://docs.python.org/reference/datamodel.html,并没有看到任何类似于 __assign__ 或 __value__ 的属性,它可以让我捕获= 运算符并允许我更新我的对象而不是为变量 n 分配一个 int,抛出我的对象远离。更好的是,当一个可变对象位于元组 t = (m, n) 中时,我想用 t[1] = 34 更新我的可变对象,但 Python 认为这是在尝试修改不可变对象。

所以我猜答案是,根据我能够理解的那份文档的一小部分,我正在尝试的不是 Pythonic。所以如果我不能按照我想要的方式去做,那么下一个最好的事情是什么?这样,如果有一天有人必须维护我的代码,它就不会过于冒犯。

【问题讨论】:

【参考方案1】:

您的基本obj.value = newvalue 基本上是最好、最容易理解的方式。正如您所猜测的,在 Python 中无法覆盖赋值。

您可以在您的班级上实现__call__() 来完成作业,这样您就可以只做obj(newvalue)。但是,对于不经意的读者来说,根本不清楚这是重新分配。

另一个想法是实现__ilshift__(),这样你就可以做到obj <<= newval。如果你足够用力地眯着眼睛,那至少看起来像是某种突变体重新分配操作。如果它不是数字类型,我可能会考虑它。但是<<int 具有明确定义的含义,并且由于您伪装成该类型,恕我直言,以这种方式使用它会令人困惑。

【讨论】:

感谢您提出的想法,以及对我对这些概念的有限理解的改进。我暂时不考虑代码,因为我还有真正的工作要做,但是当需要更新时,我会做出决定。

以上是关于在不可变对象中修改可变对象的pythonic方法的主要内容,如果未能解决你的问题,请参考以下文章

python天坑------可变对象

python可变类型和不可变类型

Python(黄金时代)—— python深入使用

Python基础_列表元祖和字典

python 函数传递可变不可变对象

python中的值传递和引用传递(可变对象与不可变对象)也就是赋值的原理-python全部是引用传递