[英]Why type(classInstance) is returning 'instance'?
我有一個方法接受一個可以是幾種類型的參數,並且必須根據類型做一件事或者其他事情,但如果我檢查所述參數的類型,我不會得到'真實'類型,我總是得到<type 'instance'>
,這就搞砸了我的比較。
我有類似的東西:
from classes import Class1
from classes import Class2
# Both classes are declared in the same file.
# I don't know if that can be a problem #
# ... #
def foo(parameter)
if (type(parameter) == type(Class1()):
# ... #
elif (type(parameter) == type(Class2()):
# ... #
並且當type(parameter)
返回<type 'instance'>
type(Class1())
<type 'instance'>
並且type(Class1())
也是<type 'instance'>
type(Class1())
<type 'instance'>
,事實證明即使參數是Class2的一個實例,它也會進入第一個比較...
順便說一下, str(parameter.__class__)
正確地顯示了classes.Class1
。 我想我總是可以使用它,但我想了解發生了什么...我已經做了十分之一的比較,所有這些都正常工作......
謝謝!! :)
舊式課程就是這么做的。 從定義中的object
派生類。
你應該真的使用isinstance:
In [26]: def foo(param):
....: print type(param)
....: print isinstance(param, Class1)
....:
In [27]: foo(x)
<type 'instance'>
True
對於內置類型,類型更好。
type(x)
為遺留的所有實例x
返回相同類型對象的事實,即舊式類,是這類類的許多令人憤怒的缺陷之一 - 不幸的是它們必須保留(並且是Python 2.*
一個沒有基類的類2.*
出於向后兼容的原因。
不過, 不要使用舊式的類,除非你被迫維護一堆舊的遺留代碼(沒有一個好的測試套件讓你有信心嘗試切換類o)。 當一個類沒有“自然”基礎時,將它從object
繼承而不是從無。 或者,您的模塊位於頂部,可以設置
__metaclass__ = type
它將默認從古老的舊式類更改為閃亮的新式類 - 雖然顯式繼承自object
通常是首選(“顯式優於隱式”), __metaclass__
的模塊全局設置可能對現有的舊模塊感覺“侵入性較小”,你可以從舊課程轉換到新課程,因此可以提供。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.