从 python 中的排序列表调用继承 class 的新方法

call a new method of inherited class from sorted list in python

我创建了一个新的 class 继承自列表。 我有一个新方法 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:

改为

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

这将避免递归

您需要调用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)))