Search code examples
pythoninherited

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


I made a new class inherited from list. And I have a new method of mysum(). Could you help me to call mysum() after sorting a list like this?

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:

Solution

  • You need to call the super method. What you've done is make a recursive call (it's calling the same sort method over and over again).

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

    Apart from that, this doesn't seems like a good use of inheritance. If you want to work with many types of iterables, then this will become difficult. I'd define mysum as a function, and then use the standard sort methods:

    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)))