我有一个父类(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
并覆盖 max
、 min
和 sorted
方法?
最佳答案
只需实现 __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/