2012-02-29 101 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__可能會很有用,但這種解決方案對我來說似乎是錯誤的。

相關問題