我有一个超类的多个子类,它们在instance_of_a_class.value中存储一些东西,我重写__cmp __()以提供合理的==,<,>比较.
但是,我在我的代码中有多个位置
min(list_of_instances_of_class,key = lambda _:_. value)或max(list_of_instances_of_class,key = lambda _:_. value)和偶尔排序(…
是否有一个函数要在类中重写,这样我就不必为每个对所述函数的调用指定键函数,或者我是否需要子类列表并覆盖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()