【发布时间】:2018-07-13 19:40:56
【问题描述】:
编辑:我没有改变对象的可变性,只是让变量表现得像它。我没有考虑具体的实现,但可能会使用它来使具有可变项的元组可散列
我知道在 python 中你可以让不可变对象表现得像可变对象——特别是它们不是可散列的,并且你可以编辑对象而不必创建一个新对象——通过将它包含在一个列表中,所以它的行为就像一个 C 指针:
myVar = 5
myVar2 = myVar
#both point to same object 5
myVar += 1
#myVar2 still 5, myVar has new object 6
myVar = [5]
#myVar is no longer immutable
myVar2 = myVar
myVar[0] += 1
#myVar2 is now also 6
这意味着您可以更改变量指向的对象的值,它将影响引用该对象的所有变量
但是有没有相反的方法 - 使可变对象的行为不可变(并且是可散列的)?元组不会这样做 - 如果元组中的值是可变的,则可以更改它,并且具有可变对象的元组是不可散列的。我想这样做主要是为了它可以像不可变对象一样存储,其中具有相同值的变量都指向同一个对象,并且对变量的更改会导致新对象而不影响其他变量,或者我必须基本上用 OOP 重新实现 python 命名方法?
总结:我想要一个可变对象的不可变包装器,与元组不同,它不允许编辑项目,并且是可散列的
【问题讨论】:
-
你理解错了。不可变对象不能制作可变。通过将它们放在一个列表中,您只需将不可变对象包装在一个可变容器中。
-
这是个问题吗?
-
你想操纵什么样的对象?即,你有什么,你想要什么?
-
如果我理解正确...您可以将大多数类型子类化,并使它们“行为”不变,因为 python 本质上是多态的。您只需在 init 之后覆盖设置器(不知道为什么要这样做)。此外,您可以使用“borg 设计模式”或类变量来使所有引用具有相同的数据(尽管技术上在不同的对象中)。这会让你达到我认为的 90%。
标签: python-3.x