2012-02-29 102 views
3

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

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

如果使用类本身的想法是错误的,那么我将使用classnames,但这需要我保持它们的独特性,所以我宁愿使用类本身。

编辑:我做了一个试验:

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

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

这将打印“真”,但我仍然不知道是否有它是假的同一类的一种方式。

回答

2

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

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

+1

谢谢。我仍然相信这是我试图实施的系统所必需的,但感谢您的警告。 – zefciu 2012-02-29 16:26:41

2

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

+0

我并不担心缺乏唯一性(这会产生误报)。我担心存储在内存中两个地方的同一个类(这会产生误报)。 – zefciu 2012-02-29 09:35:57

+2

@zefciu,相同的类不能存储在内存中的两个地方,否则它是不一样的... – warvariuc 2012-02-29 09:52:58

0

散列,除非你明确地覆盖它,将是id() - 这是内存位置。

所以任何两个类将有不同的散列,除非它是两个引用到同一个实例。如果它是在模块导入时设置的类,那么它是同一个实例,因为导入时的代码只执行一次。在我能想到的所有其他情况下,这将是不同的情况。

2

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