Python では、オブジェクトはクラス定義で定義されていない動的属性を持つことができます。この動的な動作は、オブジェクトの属性検索が失敗したときに呼び出される getattr メソッドによって実現されます。残念ながら、モジュールは本質的に __getattr__ をサポートしません。
目的は、属性が見つからない場合に、定義済みクラスのインスタンスが同じ名前であり、その名前のメソッドがそのインスタンスで呼び出されます。試行された実装と課題
を実装しようとしました:
ただし、このアプローチには 2 つの障害があります。<code class="python">class A(object): def salutation(self, accusative): print "hello", accusative # intentionally on the module, not the class def __getattr__(mod, name): return getattr(A(), name) if __name__ == "__main__": salutation("world") # hoping for __getattr__ to be invoked</code>
sys.modulesディクショナリは柔軟性があり、モジュールへのアクセスをインターセプトするラッパーの作成が可能です。ただし、これはモジュールを介したメソッドへのアクセスのみをサポートしており、モジュール自体内ではサポートされていません。さらに、毎回新しいインスタンスを作成すると、グローバル アプローチと比較して異なる動作が発生する可能性があります。
クラス置換:Guido van Rossum が推奨するハック的なアプローチこれには、クラスを作成し、sys.modules[__name__] をそのクラスのインスタンスに置き換えることが含まれます。これにより、__getattr__/__setattr__/__getattribute__ の使用が可能になります。ただし、次の注意事項があります。
置換後は、他のすべてのモジュール属性が失われます。以上がPython でモジュールの getattr 機能を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。