簡體   English   中英

為什么type(classInstance)返回'instance'?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM