为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建不可变对象的副本并更新某些属性?

如何创建不可变对象的副本并更新某些属性?

FFIVE 2022-01-05 20:37:16
我定义了一个不可变的类,如这里所述。现在我想定义一个复制方法,它将给定实例的所有属性转移到一个新实例,并允许为任何现有属性提供新值。这就是我所拥有的:from operator import itemgetterclass Foo(tuple):    __slots__ = []    def __new__(cls, a, b, c):        return tuple.__new__(cls, (a, b, c))    a = property(itemgetter(0))    b = property(itemgetter(1))    c = property(itemgetter(2))    def copy(self, a='', b='', c=''):        return Foo(            a=a if a else self.a,            b=b if b else self.b,            c=c if c else self.c,        )期望的行为:instance_a = Foo('a', 'b', 'c')instance_b = instance_a.copy(c='d')assert instance_b.a == 'a'assert instance_b.b == 'b'assert instance_b.c == 'd'问题:除了if else构造(即a=a if a else self.a)之外,是否有更优雅的方式在新属性和现有属性之间进行选择?
查看完整描述

2 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

collections.namedtuple在标准库中做同样的事情,并有一个方便的复制方法也被调用_replace:


from collections import namedtuple


Foo = namedtuple('Foo', ('a', 'b', 'c'))


x = Foo(1, 2, 3)

print(x)

y = x._replace(b='hello')

print(y)

输出


Foo(a=1, b=2, c=3)

Foo(a=1, b='hello', c=3)


查看完整回答
反对 回复 2022-01-05
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

a or self.a
但是如果bool(a)被评估为False它会有意外的行为。但是在您的问题中已经是这种情况。

查看完整回答
反对 回复 2022-01-05
  • 2 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信