2012-03-09 55 views
6

這是我的理解,因爲類型/級別統一值是從object派生的類型。不過,我無法在文檔中找到絕對的確認。雖然我認爲isinstance(anything, object)應該始終是True,但我也可以想象在Python 2代碼庫中存在傳統的邊緣情況。有沒有人知道isinstance(value, object)而不是True在isinstance(value,object)不是True的Python中是否有任何值?

背景:作爲一個類型層次我設計的一部分,有一個爲我想isinstance(obj, Alpha)總是返回True全encompasing Alpha類型。我在想Python 2.6+ ABCMeta.register(object)應該做的伎倆,但我想確定。

編輯:爲了後代的緣故,ABCMeta.register(object)將不起作用(嘗試它)。 Ethan Furman在下面的回答中爲這種情況提供了另一種解決方案。

+0

一切都是'object'的一個實例。在C級別上有一些技巧甚至使'type(object)'成爲對象的一個​​實例。我現在沒有任何參考資料,但是在過去的六個月裏,有一篇關於此的博客文章。 – agf 2012-03-09 20:00:44

回答

1

有可能在非Python代碼中創建類(例如,C),這些類不是從object派生的。

你應該能夠實現你想要的加入__subclasshook__Alpha

--> import abc 
--> class Test(object): 
... __metaclass__ = abc.ABCMeta 
... @classmethod 
... def __subclasshook__(cls, C): 
...  return True 
... 
--> isinstance(dict(), Test) 
True 
--> isinstance(42, Test) 
True 
--> isinstance(0.59, Test) 
True 
--> class old_style: 
...  pass 
... 
--> isinstance(old_style(), Test) 
True 
+0

Hrm ..但任何純python類型將始終從對象派生?這可能是足夠好的了,只要它同樣適用於常用/標準庫C模塊(cStringIO,cDecimal等) – maaku 2012-03-09 20:04:49

+0

除非它們仍然使用舊的類風格 - 但如果這種區分不重要,你的'__subclasshook__ '可以忽略它(例如)。 – 2012-03-09 20:10:10

+0

太棒了!這看起來像是'Alpha'的理想解決方案。謝謝Ethan! – maaku 2012-03-09 20:26:15

0

在2.x中,用戶定義的類(和幾個STDLIB類)不從對象默認派生。這在3.x中得到了修復。

+0

Mayby這是maaku意爲「自從類型/階級統一」的意思嗎? – WolframH 2012-03-09 20:21:35

+0

@WolframH:每個* literal *是一個對象的實例。它仍然(在2.x中)可能創建其實例不是對象實例的類。 – 2012-03-09 20:29:07

相關問題