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

我定义了一个不可变的类,如这里所述。现在我想定义一个复制方法,它将给定实例的所有属性转移到一个新实例,并允许为任何现有属性提供新值。


这就是我所拥有的:


from operator import itemgetter


class 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)之外,是否有更优雅的方式在新属性和现有属性之间进行选择?


FFIVE
浏览 130回答 2
2回答

慕尼黑5688855

collections.namedtuple在标准库中做同样的事情,并有一个方便的复制方法也被调用_replace:from collections import namedtupleFoo = 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)

牧羊人nacy

a or self.a但是如果bool(a)被评估为False它会有意外的行为。但是在您的问题中已经是这种情况。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python