【问题标题】:Is it OK to use classes as dictionary keys in python?在python中使用类作为字典键可以吗?
【发布时间】:2012-03-18 18:37:09
【问题描述】:

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

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

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

编辑:我做了一个测试:

# 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。

【问题讨论】:

    标签: python class dictionary hashmap


    【解决方案1】:

    这是完全有效的,但请注意,您所做的是向该类添加方法。

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

    【讨论】:

    • 谢谢。我仍然认为这对于我正在尝试实施的系统是必要的,但感谢您的警告。
    【解决方案2】:

    这完全没问题,因为类本身就是对象。对于对象,哈希键是它们的内存位置,保证是唯一的。让我参考一下...

    【讨论】:

    • 我不担心缺乏唯一性(这会产生误报)。我担心存储在内存中两个位置的同一个类(这会产生假阴性)。
    • @zefciu,同一个类不能同时存放在内存中的两个地方,否则就不一样了……
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      TypeError: unhashable type: 'SubClassOfSubclass'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-03
        • 2013-10-14
        • 2011-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-03
        相关资源
        最近更新 更多