0

我创建了一个从列表继承的新类。我有一个 mysum() 的新方法。你能帮我在对这样的列表进行排序后调用 mysum() 吗?

class MyList(list):
    def mysum(self):
        sum = 0
        for i, e in enumerate(self):
            sum += i*e
        return sum
    
    def sort(self):
        self.sort()             # ??
        return self             # ??

if __name__ == "__main__":
    ml = MyList([5, 3, 4, 1])
    print(ml.mysum())           # 1*3 + 2*4 + 3*1, OK
    print(ml.sort().mysum())    # 1*3 + 2*4 + 3*5, Doesn't work with RecursionError:
4

2 回答 2

2

您需要调用该super方法。您所做的是进行递归调用(它一遍又一遍地调用相同的排序方法)。

class MyList(list):
    def mysum(self):
        return sum(i*e for i, e in enumerate(self))

    def sort(self):
        super().sort()
        return self

除此之外,这似乎不是很好地使用继承。如果您想使用多种类型的可迭代对象,那么这将变得很困难。我将 mysum 定义为一个函数,然后使用标准的排序方法:

def mysum(data):
    return sum(i*e for i, e in enumerate(data))


if __name__ == "__main__":
    ml = [5, 3, 4, 1]
    print(mysum(ml))
    print(mysum(sorted(ml)))
于 2021-07-25T00:05:24.607 回答
1

将其更改为

def sort(self):
    super().sort()             
    return self        

这将避免递归

于 2021-07-25T00:04:21.320 回答