我有一个父类(super class)的多个子类,它们在 instance_of_a_class.value 中存储一些东西,我覆盖 __cmp__() 以提供合理的 ==<> 等比较。

但是,我的代码中有多个位置
min(list_of_instances_of_class, key=lambda _: _.value)max(list_of_instances_of_class, key=lambda _: _.value) 和偶尔的 sorted(...
类中是否有要覆盖的函数,以便我不必为每次调用上述函数指定 key 函数,或者我是否需要子类化 list 并覆盖 maxminsorted 方法?

最佳答案

只需实现 __lt__ :

class Obj(object):
    def __init__(self, value):
        self.value = value
    def __lt__(self, other):
        return self.value < other.value
    def __repr__(self):
        return 'Obj(%r)' % self.value

obj_list = [Obj(2), Obj(1), Obj(4), Obj(3)]

print max(obj_list)
print min(obj_list)
print sorted(obj_list)
__cmp__ 已弃用,您提到的所有函数仅使用 __lt__ 而不是其他比较。

如果由于某种原因你真的不能让他们以这种方式进行比较,你可以这样做:
from operator import attrgetter
from functools import partial

valget = attrgetter('value')

maxval = partial(max, key=valget)
minval = partial(max, key=valget)
sortedval = partial(sorted, key=valget)
sortval = partial(list.sort, key=valget)

您将它们称为 maxval(obj_list) 而不是 max(obj_list) 等,并且将 sortval(obj_list) 就地排序而不是 obj_list.sort()

关于python - 有没有办法在列表项的类中覆盖 list.max() 和 list.sort() 的 "key"函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7565630/

10-16 05:17