我定义了一个不可变的类,如这里所述。现在我想定义一个复制方法,它将给定实例的所有属性转移到一个新实例,并允许为任何现有属性提供新值。这就是我所拥有的: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)
添加回答
举报
0/150
提交
取消