求和对象属性列表

时间:2015-07-01 09:43:20

标签: python list python-2.7

我有一个定义为

的类
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函数想要添加两种不同的类型。

2 个答案:

答案 0 :(得分:3)

sum需要某处启动;默认情况下,它从0开始。所以它尝试的第一个操作是0 + MyClass(value=1),你还没告诉它怎么做!

因此,您有两种选择:

  1. 指定start(例如sum(c, MyClass()));或
  2. 告诉MyClass如何处理向实例添加整数。
  3. 后者可能看起来像:

    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__