Skip to main content
 首页 » 编程设计

python之获取某个属性具有特定值的类实例

2025年05月04日18bluestorm

我确定有一个术语可以表达我正在寻找的东西,或者如果没有,那么我尝试做的事情实际上是愚蠢的,这是有充分理由的。

但无论如何。我想知道是否有一种(准)内置方​​法来查找属性设置为特定值的特定类实例。

一个例子:

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。