我确定有一个术语可以表达我正在寻找的东西,或者如果没有,那么我尝试做的事情实际上是愚蠢的,这是有充分理由的。
但无论如何。我想知道是否有一种(准)内置方法来查找属性设置为特定值的特定类实例。
一个例子:
class Klass(object):
def __init__(self, value):
self.value = value
def square_value(self):
return self.value * self.value
>>> a = Klass(1)
>>> b = Klass(2)
>>> instance = find_instance([a, b], value=1)
>>> instance.square_value()
1
>>> instance = find_instance([a, b], value=2)
>>> instance.square_value()
4
我知道我可以编写一个循环遍历所有 Klass 实例的函数,并返回具有请求值的实例。另一方面,这个功能感觉好像它应该已经存在于 Python 中,如果不是,那一定有很好的理由说明它不存在。换句话说,我在这里尝试做的事情可以用更好的方式完成。
(当然,我不是在寻找一种方法来计算一个值的平方。以上只是我正在尝试寻找的构造的一个示例)。
请您参考如下方法:
使用过滤器:
filter(lambda obj: obj.value == 1, [a, b])
过滤器将返回符合您指定要求的对象列表。文档:http://docs.python.org/library/functions.html#filter
基本上,filter(fn, list) 遍历 list,并将 fn 应用于每个项目。它收集 fn 返回 true 的所有项目,然后放入列表中并返回它们。
注意:过滤器将始终返回一个列表,即使只有一个对象匹配。因此,如果您只想返回匹配的 第一个 实例,则必须执行以下操作:
def find_instance(fn, objs):
all_matches = filter(fn, objs)
if len(all_matches) == 0:
return False # no matches
else:
return all_matches[0]
或者,更好的是,
def find_instance(fn, objs):
all_matches = filter(fn, objs)
return len(all_matches) > 0 and all_matches[0] # uses the fact that 'and' returns its second argument if its first argument evaluates to True.
然后,你可以这样调用这个函数:
instance = find_instance(lambda x: x.value == 1, [a, b])
然后 instance 将是 a。
