22

私は現在、これを理解するために pdb trace にいます

ipdb> isinstance(var, Type)
False
ipdb> type(var)
<class 'module.Type'>
ipdb> Type
<class 'module.Type'>

なぜこれが起こることができますか?

PSは期待通りisinstance(var, type(var))に戻るTrue

4

3 に答える 3

23
  1. 私は推測することしかできませんが、あなたがそうするならmodule

    class Type(object): pass
    var = Type()
    class Type(object): pass
    

    両方のタイプは のように見えます<class 'module.Type'>が、それでも異なります。

    あなたはそれをチェックすることができます

    print(id(Type), id(var.__class__))
    

    または

    print(Type is var.__class__)
    

    これらの比較は、古いスタイルのクラスと新しいスタイルのクラスの両方で機能することに注意してください。新しいスタイルのクラスの場合、それらはprint(Type is type(var)). しかし、これは古いスタイルのクラスには当てはまりません。

  2. 別の非常に一般的なトラップは、このモジュールを次のように呼び出すことです。

    python -m module
    

    また

    python module.py
    

    モジュールとして知られるようにし__main__ます。真の名前で別の場所にインポートされた場合、その名前と別の名前空間で認識されます。

  3. 別の推測として、ABC__instancecheck__()を使用している、またはクラスにメソッドを持たせている可能性があります。

于 2012-05-14T11:54:12.890 に答える