2

考虑以下代码片段。

class MyClass(object):
  @property
  def foo(self):
    return self._foo      

l = [my_class1, my_class2]

min(l, key=MyClass.foo) # doesn't work because foo is not callable. 
                        # "TypeError: 'property' object is not callable"

有没有办法让它工作?

4

2 回答 2

4

使用operator.attrgetter

min(l, key=operator.attrgetter('foo'))

例子:

>>> class MyClass(object):
...     def __init__(self, val):
...         self._foo = val
...     def __repr__(self):
...         return 'MyClass({})'.format(self._foo)
...     @property
...     def foo(self):
...         return self._foo
... 
>>> import operator
>>> min([MyClass(3), MyClass(1), MyClass(2)], key=operator.attrgetter('foo'))
MyClass(1)
于 2013-11-12T06:48:40.920 回答
3

您可以使用 lambda 表达式来访问 foo ,就像它是一个属性一样:

min(l, key=lambda o: o.foo)
于 2013-11-12T06:46:17.143 回答