尽管我从不需要它,但令我感到惊讶的是,在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
但是然后您可以通过和来访问a
和b
变量,这很烦人。self[0]``self[1]
在纯Python中这可能吗?如果没有,我该如何使用C扩展名呢?
(仅在Python 3中有效的答案是可以接受的)。
更新:
因此,继承元组是做纯Python,效果很好,除了通过访问数据的另一种可能性的方式[0]
,[1]
等等。所以,要完成这个问题,所有缺少的是HOWTO做“正确的”,在C,其中我怀疑这很简单,只是不执行任何geititem
orsetattribute
等等。但是我没有为此做,而是为此提供了赏金,因为我很懒。:)
我刚刚想到的另一种解决方案:获得与原始代码相同行为的最简单方法是
Immutable = collections.namedtuple("Immutable", ["a", "b"])
它不能解决可以通过[0]
等访问属性的问题,但是至少它要短得多,并且具有与pickle
and兼容的其他优点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的上下文菜单,但是我在下面的所有解决方案中都遇到了问题,这是时候传递分隔符的字符串了。它不显示分隔符,因为它将字符串而不是仅字符串传递给对象。 例: 问题答案: 解决您的修改。尝试以下
问题内容: 该变量很方便,部分原因是它会影响每个模块。如果我想创建另一个工作方式相同的变量,我该怎么做? 从某种意义上说,如果我在一个模块中更改foo,而在其他模块中对其进行更新,则该变量(让我们为原始变量,并将其称为“ foo”)不必是真正全局的。如果我可以在导入其他模块之前设置foo,然后它们会看到相同的值,那很好。 问题答案: 我不以任何方式,形状或形式认可该解决方案。但是,如果你将变量添加