【问题标题】:min/max based on property (not attribute) of class object in python基于python中类对象的属性(不是属性)的最小值/最大值
【发布时间】:2013-11-12 06:44:26
【问题描述】:

考虑以下代码的 sn-p。

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"

有没有办法让它工作?

【问题讨论】:

  • 在大多数情况下,使用属性与使用实例属性完全相同,包括这个。因此,适用于普通属性(attrgetter,或者当然是通过 lambda 或 def 将其作为属性访问的显式函数)的相同解决方案将在这里工作

标签: python properties key


【解决方案1】:

使用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)

【讨论】:

    【解决方案2】:

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

    min(l, key=lambda o: o.foo)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多