モジュール内で属性検索の失敗が発生した場合、関連付けられたクラスのインスタンスを作成する必要があります。モジュールを使用して、失敗した属性と同じ名前のメソッドを呼び出します。ただし、xxx メソッドの制限とモジュール属性の変更に関する制限のため、これは Python では直接サポートされていません。
直面する 2 つの課題は次のとおりです。
解決策
これらの制限を克服するための回避策は、置換クラスのラッパー インスタンスを作成し、それを sys.modules の代わりに保存することです。オリジナルモジュール。これにより、すべての属性検索がラッパー インスタンスに効果的にリダイレクトされ、getattr__ のような動作の実装が可能になります。ただし、このアプローチでは、ラッパーが毎回新しいインスタンスを作成するため、モジュールで __getattr を直接使用する場合と比較して、異なる動作が発生する可能性があることに注意することが重要です。
Guido van Rossum の Hack
Guido van Rossum は、sys.modules 内のモジュールをインスタンスまたはクラスに置き換えるためのインポート機構の許可を活用する代替アプローチを提案しました。このメソッドでは、必要な機能を持つクラスがモジュール内で定義され、モジュールの最終動作として sys.modules[__name__] に割り当てられます。これにより、モジュール自体に getattr やその他のメタプログラミング機能を実装できるようになります。ただし、モジュールの他の要素は sys.modules の割り当て時に失われるため、必要なすべての機能が置換クラス内にカプセル化されていることを確認することが重要です。
以上がPython でモジュールの「getattr」のような動作を実装するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。