我将从scala来到python,在这里,对于给定的(case)类,我可以执行一个复制,在同一步骤中,指定修改字段的任意子集。斯卡拉的情况是这样的:
case class Foo(year: Int, album: String)
// here's a Foo
val foo: Foo = Foo(1973, "Larks Tongues In Aspic")
// updated album with (shallow) copy of year in one step
val nooFoo: Foo = foo.copy(album = "Black Beauty: Live at the Fillmore West")
(为了便于复制,示例保持简单)
我见过很多关于复制不可变数据的stacko问题,但是没有更新它。我希望在不可变更新的上下文中有特殊的结构共享。
我已经看过用
namedtuple
,或引发错误
__setattr__
使一个不可变的对象。我想我可以用一些方法
object.__setattr__
这似乎让当地人负担过重
__塞塔特__
方法。
但是,这是否意味着我需要为可能执行的每个更新组合实现一个方法?
这意味着我需要定义最多N个!更新n个字段的函数(理论上)。对于有两个字段的类,可能如下所示:
import copy
class Foo:
self.year = None
self.album = None
def __init__(self, year, album):
object.__setattr__(self, "year", year)
object.__setattr__(self, "album", album)
def __setattr__(self):
raise TypeError("i pity the Foo")
def update_a(self, new_year):
noo_foo = copy.copy(self)
object.__setattr__(noo_foo, "year", new_year)
return noo_foo
def update_b(self, new_album):
noo_foo = copy.copy(self)
object.__setattr__(noo_foo, "album", new_album)
return noo_foo
什么是pythonic方法来执行不可变的对象更新(带有字段修改的副本),而不陷入编写大量类样板文件的陷阱?或者,我是不是错过了一些简单的东西?