Python: isinstance は True を返すべきなのに False を返すのはなぜですか? 質問する

Python: isinstance は True を返すべきなのに False を返すのはなぜですか? 質問する

私は現在これを理解するためにpdbトレースを行っています

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

なぜこのようなことが起こるのでしょうか?

PSは予想通りにisinstance(var, type(var))戻るTrue

ベストアンサー1

  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. もう一つの推測としては、あなたがABCsまたは、クラスに__instancecheck__()メソッドを持たせます。

おすすめ記事