最近、コンストラクターを呼び出さずにオブジェクトをインスタンス化しようとしているときに、C ベースの python 拡張機能で問題に直面しました。これは、拡張機能の要件です。
インスタンスの作成に使用するクラスは動的に取得されます。ある時点で、x
他のインスタンスの作成に使用したいクラスを持つインスタンスがあるのでx.__class__
、後で使用するために保存します。この値を にしますklass
。
後で呼び出すPyInstance_NewRaw(klass, PyDict_New())
と、問題が発生します。klass
古いスタイルのクラスの場合、その呼び出しの結果は目的の新しいインスタンスになるようです。ただし、新しいスタイルのクラスの場合、結果は NULL になり、発生する例外は次のとおりです。
SystemError: ../Objects/classobject.c:521: 内部関数の引数が正しくありません
記録のために、私は Python バージョンを使用してい2.7.5
ます。グーグルで調べてみると、解決策を探している人は他に 1 人しかいませんでした (そして、彼は回避策を実行しているように見えましたが、詳細は示していませんでした)。
レコード #2 の場合: 拡張機能が作成しているインスタンスは、これらの同じx
インスタンスのプロキシです。x.__class__
およびは既知であるため、拡張機能は(前述の C 関数を使用して) にx.__dict__
基づいて新しいインスタンスを生成し、それぞれを新しいインスタンスに設定します。インスタンス(これらにはプロセス間共有メモリデータがあります)。インスタンスを 2 回呼び出すことは概念的に問題があるだけでなく(1 つ目: 状態は既にわかっている、2 つ目: ctor の予想される動作は、インスタンスごとに 1 回だけ呼び出す必要がある)、拡張機能を使用できないため、非現実的でもあります。システム内の各インスタンスを呼び出すための引数とその順序を理解してください。また、__class__
__dict__
__dict__
__init__
__init__()
__init__
インスタンスがプロキシである可能性のあるシステム内の各クラスの、それらが対象となるプロキシメカニズムがあることを認識させることは、概念的に問題があり (彼らはそれについて知る必要がありません)、実用的ではありません。
だから、私の質問は:PyInstance_NewRaw
インスタンスのクラス スタイルに関係なく、同じ動作を実行する方法は?