我有一个定义为
的类class MyClass(object):
def __init__(self, value=0):
self.value = value
def __add__(self,other):
return MyClass(self.value + other.value)
__radd__ = __add__
我想简单地将sum
函数应用于它们:
a=MyClass(value=1)
b=MyClass(value=2)
c=[a,b]
print sum(c) # should return a MyClass instance with value 3
正如this post中所建议的那样。但是,提出了一个例外:
15
16 c=[a,b]
---> 17 print sum(c)
TypeError: unsupported operand type(s) for +: 'int' and 'MyClass'
我不明白为什么sum
函数想要添加两种不同的类型。
答案 0 :(得分:3)
sum
需要某处启动;默认情况下,它从0
开始。所以它尝试的第一个操作是0 + MyClass(value=1)
,你还没告诉它怎么做!
因此,您有两种选择:
start
(例如sum(c, MyClass())
);或MyClass
如何处理向实例添加整数。后者可能看起来像:
class MyClass(object):
...
def __add__(self, other):
try:
return MyClass(self.value + other.value) # handle things with value attributes
except AttributeError:
return MyClass(self.value + other) # but also things without
...
可让您跳过显式的start
:
>>> sum([MyClass(1), MyClass(2)]).value
3
答案 1 :(得分:1)
因为sum(iterable[, start])
总和从左到右开始并且可迭代的项目返回总数。 start
默认为0。
您可以按
修改课程class MyClass(object):
def __init__(self, value=0):
self.value = value
def __add__(self, other):
if (isinstance(other, MyClass)):
return MyClass(other.value + self.value)
else:
return MyClass(other + self.value)
__radd__ = __add__