为何两个namedtuple相加会返回普通tuple?
关于namedtuple加法返回tuple的解释
首先要明确:namedtuple本质是tuple的子类,它继承了tuple的所有内置方法,包括加法(__add__)操作。
tuple的加法逻辑是:将两个tuple对象拼接后,返回一个新的tuple实例——这个行为是tuple类型本身定义的,namedtuple并没有重写__add__方法,所以直接沿用了父类的逻辑。
回到你的代码例子:
from collections import namedtuple foo_a = namedtuple("foo_a", ["a1", "a2", "a3"]) foo_b = namedtuple("foo_b", ["b1", "b2", "b3"]) a = foo_a(1, 2, 3) b = foo_b(4, 5, 6) a + b # -> (1, 2, 3, 4, 5, 6) type(a + b) # -> tuple
哪怕是两个同类型的namedtuple实例相加,结果依然是tuple,比如:
a1 = foo_a(1,2,3) a2 = foo_a(4,5,6) print(type(a1 + a2)) # <class 'tuple'>
为什么namedtuple不重写加法来返回自身类型?原因很简单:
- 若两个不同类型的namedtuple相加,无法确定返回哪个子类的实例;
- 即使是同类型,拼接后的字段数量和原namedtuple的字段定义不匹配(原foo_a只有3个字段,拼接后有6个),无法构造合法的namedtuple实例。
这种行为是合理的,只是因为namedtuple的文档重点在它的命名字段特性,没有特意强调继承自tuple的基础操作行为。
内容的提问来源于stack exchange,提问作者sbwcwso
相关产品推荐
相关产品推荐

