检查类实例(在本例中用作dict键)是否具有与同一类的另一个实例相同的属性

时间:2017-02-25 02:57:27

标签: python dictionary attributes key instance

我想创建一个自定义类,并使用该类的实例作为dict的键。

然后我想创建该类的其他实例,并检查所有属性是否与我作为该dict的键添加的实例相同。

我认为我在这方面失败了,因为当我尝试使用时:

if my_object in my_dict:
    my_dict[my_object]['another_dict_key'].append('Found you!')
else:
    my_dict.update(my_object:{'another_dict_key':[]})

我认为它永远不会在if语句中进行,因为my_object永远不会匹配作为' my_object'已经是dict键的实例,因为它们不是完全相同的实例 - 即使它们具有相同的属性 -

我在其他帖子中读到了一些关于这个以及哈希 eq 的内容,但我仍感到困惑。我觉得也许有一种简单的方法可以做到这一点,否则我可以完全尝试另一种方法。但是想问一下。

这是对代码的更全面看法,我上面粘贴的片段只是为了解决这个问题,这里有一个更深入的看看,我想,如果这有帮助,顺便说一下:

master_dict = {}
i = 0
for order in orders:

    normalized_structure = Normalized_Structure(order)
    if normalized_structure in master_dict:
        if 'ORD_INSTRUCTIONS' in master_dict[normalized_structure]:
            master_dict[normalized_structure]['ORD_INSTRUCTIONS'].append(Normalized_Order_Instructions(order))
        else:
            master_dict[normalized_structure]['ORD_INSTRUCTIONS'] = Normalized_Order_Instructions(order)
    else:
        master_dict.update({normalized_structure:{'STRUCTURE_ID':i, 'ORD_INSTRUCTIONS':[]}})
        master_dict[normalized_structure]['ORD_INSTRUCTIONS'].append(Normalized_Order_Instructions())

1 个答案:

答案 0 :(得分:1)

我认为通常最好写出并对每个属性进行comapre,但是有20个属性你可能想要一个更灵活和简单的方法。所以对于平等检查你可以有

def __eq__(self, other):
    return isinstance(other, type(self)) and all(v == getattr(other, k)
                                                 for k, v in vars(self).items())

至于散列,取决于你想采取的方法。

def __hash__(self):
    result = 1
    for k, v in sorted(vars(self).items()):
        result = 31 * result + hash(v) # chosen prime is 31
    return result

或者您可以创建每个值的元组并将其哈希。

def __hash__(self):
    return hash(tuple(v for k, v in sorted(vars(self).items())))

<强>更新

如果您的某些属性不可删除,则可以忽略它们。

def __hash__(self):
    return hash(tuple(v for k, v in sorted(vars(self).items())
                      if getattr(v, '__hash__') is not None))

否则采取第一种方法并处理它们如何在循环中进行哈希处理。