PythonプロンプトTypeError:super(type、obj):objは、タイプのインスタンスまたはサブタイプである必要があります



Python Prompt Typeerror



PythonプロンプトTypeError:super(type、obj):objは、タイプのインスタンスまたはサブタイプである必要があります

  1. 問題を簡単に説明する

ある日、デバッグで正常に動作するPythonコードがコンパイルされて実行されますが、例外がスローされ、「TypeError:super(type、obj):objはtypeのインスタンスまたはサブタイプである必要があります」というプロンプトが表示されます。この問題の原因は、typeとobjの型に一貫性がない(つまり、objオブジェクトがtype typeのクラスによって作成されていない)ためですが、デバッグでは機能します。コンパイル後にpydモジュールを使用したことが原因なのかと突然思いましたが、モジュールの読み込み時に問題が発生しました。



エラーの原因を突き止めるために、テストコードを作成し、エラー処理を繰り返しました。モジュールは繰り返しインポートされました。 pydモジュールの場合、api load_moduleを使用するときにモジュールの名前を使用する必要があります。そうしないと、インポートが失敗しますが、ディレクトリに同じ名前で機能が異なるモジュールが存在する可能性があるため、名前を変更する必要がある場合があります。名前が以前にインポートされたモジュールを上書きした後にインポートされたモジュールを変更しないでください。図1.1のテストコードを参照してください。

現在の問題は名前を変更することですが、インポートを上書きする問題がまだある可能性があることがわかりました。 2回目のインポート後、最初に正常に作成されたオブジェクトは 'TypeError:super(type、obj)をスローします。図1.1のテストコードに示すように、objはインスタンスであるか、タイプのサブタイプが異常である必要があります。



1.1テストコード

  1. 問題の原因

1.「a」をインポートした後にトリガーされる場合があります(名前がaと同じであるため)。リロード操作は、モジュールオブジェクトを変更します。参照が存在するため(部分的に非表示のデータ構造である可能性があります)、モジュールオブジェクト内のデータの「a1」部分にも影響しますか?これは奇妙な異常につながります。



2.「a」をインポートした後にトリガーできます(名前がaと同じであるため)。リロード操作はモジュールオブジェクトを変更し、pyhtonインタープリターがリロード後のモジュールに従ってaモジュールとa1モジュールの両方を解釈するようにします。 。

上記のステートメントを確認するだけです。プロジェクトのルートディレクトリにaおよびbという名前の新しいフォルダを作成し、a.pydモジュールを配置します。モジュールのテストコードを図2.1に示します。このプログラムは16行に達すると間違っています。これは、現在のオブジェクトのタイプがクラスのタイプと矛盾していることを示します(現在のオブジェクトがこのクラスのインスタンスではないことを示します)。もちろん、このエラーはモジュールを繰り返しインポートした後に発生します。図2.2に示すように、getメソッドを呼び出す前は例外はありませんでした。

2.1a.pydモジュールのソースファイル

2.2テストコード1

次のテストは、クラスa1_module.Bを介してb_objオブジェクトを作成し、クラスre_a_module.Bを介してre_b_objオブジェクトを作成し、IDを内部的に出力して、それらのIDが同じであることを示します。これらはすべて、re_a_module.BのIDである76028552であり、pythonを示します。インタープリターが内部で解釈すると、最初にインポートされたクラスも後でオーバーロードされたクラスとして解釈され、superをインスタンス化するときにTypeErrorが発生します。要約すると、仮定2が成り立ちます。図2.3を参照してください。

2.3テストコード2

  1. 解決
    1. シミュレーションケース

分析後、モジュールがリロードされない限り問題は回避できると思います。そのため、モジュールを最初にインポートした後、システムモジュールディクショナリから「a」モジュールがポップされ、エクスポートされたモジュールは次のように更新されます。 'a1'のキーを持つsys。モジュールは上記の問題を解決できます。例:sys.modules.update({'a1':sys.modules.pop( 'a')})図3.1を参照してください。

3.1シミュレーションケースソリューション