【问题标题】:pythonic way of modifying a mutable inside an immutable在不可变对象中修改可变对象的pythonic方法
【发布时间】: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。所以如果我不能按照我想要的方式去做,那么下一个最好的事情是什么?这样,如果有一天有人必须维护我的代码,它就不会过于冒犯。

【问题讨论】:

    标签: python class object default internals


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您提出的想法,以及对我对这些概念的有限理解的改进。我暂时不考虑代码,因为我还有真正的工作要做,但是当需要更新时,我会做出决定。
    猜你喜欢
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    相关资源
    最近更新 更多