我有一个超类的多个子类,用于存储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
并覆盖{ {1}},max
和min
方法?
答案 0 :(得分:6)
只需实施__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()
答案 1 :(得分:1)
不直接,不。最简单的方法可能是定义您使用的特定函数来代替min / max / sorted。 e.g。
from functools import partial
min_myclass = partial(min, key = operator.attrgetter('value'))
max_myclass = partial(max, key = operator.attrgetter('value'))
...
min_myclass(list_of_instances_of_myclass)