在python中使用类作为字典键是否可以?

时间:2012-02-29 09:16:27

标签: python class dictionary hashmap

我即将编写一个函数,为类找到正确的处理程序。为了实现它,我想使用从类到处理程序的映射。我已经检查过可以使用类作为字典键,但是我不能完全确定它是否正确的想法。

我主要担心的是,如果我保证如果我在两个不同的模块中导入了一个类,那么这两个将具有相同的散列。但也许我应该考虑其他一些方面。

如果使用类本身的想法是错误的,那么我将使用类名,但这需要我保持它们的唯一性,所以我更愿意使用类本身。

编辑:我做了一个测试:

# file: a.py
import datetime                                                                 
D = datetime.datetime 

# file: b.py
import datetime
from a import D
print hash(D) == hash(datetime.datetime)

这会打印“True”,但我仍然不确定是否有同一类的False方法。

4 个答案:

答案 0 :(得分:2)

这是完全可以的,因为类本身就是对象。对于对象,散列键是它们的存储位置,保证它是唯一的。让我参考一下......

答案 1 :(得分:2)

使用类作为字典键是完全有效的,我已经做过几次了。但是,继承将不起作用,也就是说,类的处理程序将不适用于它可能不是您想要的子类。 __mro__在这种情况下可能有用,但这个解决方案对我来说似乎不对。

答案 2 :(得分:2)

它完全有效,但请注意,您正在做的是假冒 - 为该类添加方法。

考虑是否以正常方式或者可能仅仅通过游击修补方式向您的类添加适当的方法会更好。 (可能不是,但考虑一下)。

答案 3 :(得分:0)

但是,在 python3.6 中,这不再适用于子类。 我的示例是一个3类的层次结构,它以

失败

TypeError:不可散列的类型:'SubClassOfSubclass'