2017-08-14 44 views
-2

說我有一個自定義類:如何比較類型的自定義類的

class MyClass(): 
    pass 

,我想測試,如果這是MyClass的實例。這可以在沒有轉換爲字符串的醜陋混亂的情況下完成嗎?

str(type(MyClass())) == "<class '__main__.MyClass'>" 
+0

你的意思是像'isinstance(MyClass(),MyClass)#True'?注意:'type(MyClass())== MyClass'也可以工作,但不推薦使用。 – AChampion

+0

實際上並非如此。 – v4gil

+0

我正在尋找類似於上面的答案,因爲它也可以在[class1,class2]'中用作type(MyClass())。 – v4gil

回答

3

可以這樣,無須轉換爲字符串的醜陋的爛攤子實現的呢?

是的。使用內置功能isinstance。從文檔:

如果object參數是classinfo參數的實例或其(直接,間接或虛擬)子類的實例,則返回true。如果object不是給定類型的對象,則該函數總是返回false。

>>> class MyClass(): 
...  pass 
... 
>>> isinstance(MyClass(), MyClass) 
True 

你也可以做到這一點使用type這樣:

>>> type(MyClass) == type(MyClass) 
True 

但這不是推薦,因爲type未能採取亞型考慮在內。 From the documentation for type

isinstance()內置函數建議用於測試對象的類型,因爲它需要的子類考慮進去。

+0

或...在這種情況下......不推薦。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ啊,我看到你在那裏做了什麼;-)(當然,這是假設你想開個玩笑,如果情況並非如此,你想告訴我在我的答案中有嚴重的錯誤,只是忽略整個評論,我似乎很難說有人在開玩笑)。 –

+0

是的,你的帖子沒有問題,這就是爲什麼我高舉了它。 :p –

0

使用__class__.__name__的情況下,像這樣:

>>> class MyClass(): 
... pass 
... 
>>> i = MyClass() 
>>> i.__class__.__name__ 
'MyClass' 

或者,isinstance如果你有機會到父類:

>>> isinstance(i, MyClass) 
True 

作爲一類的任何對象,也任何父類的實例isinstance將返回所有父母的True

>>> class MyOtherClass(MyClass): 
... pass 
... 
>>> q = MyOtherClass() 
>>> isinstance(q, MyClass) 
True 
>>> isinstance(q, MyOtherClass) 
True 
>>> isinstance(q, object) 
True 

但是:

>>> q.__class__.__name__ 
'MyOtherClass' 
+0

如果不訪問該類,OP將無法創建'i'。 – AChampion