使 class 具有可比性,以便我可以获得列表中 class 个实例的最大参数值 (Python)

Make a class comparable so that I can get the max paremeter value of class instances within a list (Python)

我有一个定义单个元素 (Request) 的 class 和由 Request 个实例组成的另一个 class (RequestsBook)。 RequestsBook 也有将更多请求附加到书中的方法。

class Request:
    def __init__(self, req_id, req_type, value):
        self.req_id = req_id
        self.req_type= req_type
        self.value = value

class RequestsBook:
    def __init__(self):
        self.requests_book = list()

    def add(self, new_req):
        self.requests_book.append(new_req)

    def get_max_value_of_type(self, req_type):
        # pass

如上所示,我想了解如何有效地获取 RequestsBook 列表中与特定匹配的 Request 个实例中的最大值 value输入.

例如:

rb = RequestsBook()
rb.add(Request(1, 'A', 100))
rb.add(Request(2, 'B', 42))
rb.add(Request(3, 'A', 78))
rb.add(Request(4, 'A', 12))

rb.get_max_value_of_type('A') # should return 190
rb.get_max_value_of_type('B') # should return 42 

根据我的理解,我需要使用 functools.total_ordering 装饰器使 Request class 具有可比性。

我以前从未使用过这个装饰器,我正在努力想出一种有效的方法来实现 get_max_value_of_type。遗憾的是,这个用例的在线示例并不多。任何帮助将不胜感激。

此代码按类型排序,然后按值排序,然后检索最大值作为最后一项。它使用 sorted 内置的键函数,attrgetter 来自 operator 模块。它遵循 Python 文档 (3.10) 中的 Sorting HOWTO tutorial 中的解释。

from operator import attrgetter

class Request:
    def __init__(self,request=(None,None,None)):
        self.num, self.type, self.value = request

    def __repr__(self):
        return repr((self.num,self.type,self.value))

class RequestsBook(Request):
    def __init__(rb):
        Request.__init__(rb)
        rb.bklist = []
        rb.typetp = ('A','B','C')

    def sortattr(rb,l,a):
        return sorted(l,key=attrgetter(a))

    def maxtype(rb):
        typel = rb.sortattr(rb.bklist,'type')
        maxl = []
        for t in rb.typetp:
            tl = [req for req in typel if req.type == t]
            mtl = rb.sortattr(tl,'value')
            maxl.append(mtl[-1])
        return maxl           
    
inputl = [(1,'A',100),(2,'B',40),(3,'C',30),(4,'A',40),(5,'A',10),(6,'A',80),(7,'C',30),(8,'C',10),(9,'B',70),(10,'B',90)]
bk = RequestsBook()
bk.bklist = [Request(i) for i in inputl]
maxtypel = bk.maxtype()
print('input: ',inputl)
print('output: ',maxtypel)