在不可变的内部修改mutable的pythonic方法

时间:2010-12-29 05:51:49

标签: python class object default internals

假设我有一个类作为外部世界的int,但事实上它是一个可变对象,在几个结构中有固定的位置。如果n是我的对象,我现在可以通过编写n.update(34)来更新它,但我发现我总是想要编写n = 34。我已经浏览了http://docs.python.org/reference/datamodel.html,并没有看到像__assign__或__value__这样的属性,它会让我陷阱=运算符并允许我更新我的对象而不是为变量赋值呃,扔掉我的物体。更好的是,当一个mutable位于元组t = (m, n)中时,我想用t[1] = 34更新我的mutable,但是Python认为这是尝试修改不可变的。

所以我想答案是,基于我能够理解的那篇文章,我正在尝试的不是Pythonic。所以,如果我不能按照我想要的方式去做,那么下一个最好的事情是什么呢?如果某人有一天必须维护我的代码,那就不会过于冒犯。

1 个答案:

答案 0 :(得分:3)

您的基本obj.value = newvalue基本上是最好,最容易理解的方式。正如你猜测的那样,不可能在Python中覆盖赋值。

您可以在班级上实施__call__()来执行作业,这样您就可以obj(newvalue)。然而,对于不经意的读者来说,这是一个重新分配,这一点并不清楚。

另一个想法是实施__ilshift__(),以便您可以obj <<= newval。如果你足够眯眼,至少看起来像某种突变体重新分配操作。如果它不是数字类型,我可能会考虑它。但是<<int有明确的含义,因为你伪装成那种类型,恕我直言,以这种方式使用它会让人感到困惑。