当前位置: 首页 > 面试题库 >

如何在Python中制作一个不变的对象?

蒋嘉实
2023-03-14
问题内容

尽管我从不需要它,但令我感到惊讶的是,在Python中创建不可变对象可能有些棘手。您不能仅仅重写__setattr__,因为这样您甚至不能在中设置属性__init__。将元组子类化是一种有效的技巧:

class Immutable(tuple):

    def __new__(cls, a, b):
        return tuple.__new__(cls, (a, b))

    @property
    def a(self):
        return self[0]

    @property
    def b(self):
        return self[1]

    def __str__(self):
        return "<Immutable {0}, {1}>".format(self.a, self.b)

    def __setattr__(self, *ignored):
        raise NotImplementedError

    def __delattr__(self, *ignored):
        raise NotImplementedError

但是然后您可以通过和来访问ab变量,这很烦人。self[0]``self[1]

在纯Python中这可能吗?如果没有,我该如何使用C扩展名呢?

(仅在Python 3中有效的答案是可以接受的)。

更新:

因此,继承元组是做纯Python,效果很好,除了通过访问数据的另一种可能性的方式[0][1]等等。所以,要完成这个问题,所有缺少的是HOWTO做“正确的”,在C,其中我怀疑这很简单,只是不执行任何geititemorsetattribute等等。但是我没有为此做,而是为此提供了赏金,因为我很懒。:)


问题答案:

我刚刚想到的另一种解决方案:获得与原始代码相同行为的最简单方法

Immutable = collections.namedtuple("Immutable", ["a", "b"])

它不能解决可以通过[0]等访问属性的问题,但是至少它要短得多,并且具有与pickleand兼容的其他优点copy

namedtuple创建与我在此答案中描述的类型相似的类型,即派生自tuple并使用__slots__。它在Python
2.6或更高版本中可用。



 类似资料:
  • 问题内容: 在Python中,是否有一个库方法可在同一类的两个(已经存在)实例之间复制所有属性? 我的意思是,类似Apache Commons的东西 问题答案: 如果您的班级未修改或出于特殊属性访问目的,则所有属性都存储在其中,因此您可以执行以下操作: 如果使用python属性,则应查看并筛选出要复制的属性。

  • 问题内容: 如何在NetBeans中为Java程序创建.exe文件? 我环顾四周,可以制作JAR文件,但不能制作exe文件。 问题答案: 看一下JAR包装器,例如Jar2Exe,JSmooth或Launch4j。 他们会将JAR包装在可执行文件中,该可执行文件将启动JVM。

  • 有人能告诉我如何从顶部屏幕打开一个自定义对话框吗?就像这张照片一样? 我试着使用,在底部sheet fragment中,一切工作都很好,但是我不能像top sheet fragment那样设置它的行为,我需要这样做。

  • 问题内容: 我有类似的东西: 现在,我想用另一个JSON结构值替换“我的英语标题” 。 我尝试了: 但这是行不通的。任何人都可以给我提示如何在JSON变量中获取JSON值? 编辑:这是使用Jquery的上下文菜单,但是我在下面的所有解决方案中都遇到了问题,这是时候传递分隔符的字符串了。它不显示分隔符,因为它将字符串而不是仅字符串传递给对象。 例: 问题答案: 解决您的修改。尝试以下

  • 问题内容: Python在一行中实际上分配多个变量的实际步骤是什么? 我过去经常做A [0],A [1] = A [1],A [0]交换,但是最近我在分配链接列表时遇到了一个错误。 变得早于我的预期,所以分配成为 但是,如果我这样做 有用! 我“假设”步骤是 不 那么,这些步骤是什么? 问题答案: Python中有一种叫做“扩展分配”的东西。 长话短说,您可以通过任务扩展迭代。例如,以下代码评估并