ホームページ >バックエンド開発 >Python チュートリアル >Python でモジュールの getattr 機能を実装するにはどうすればよいですか?

Python でモジュールの getattr 機能を実装するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-29 20:48:03360ブラウズ

How to Implement getattr Functionality for Modules in Python?

モジュールに getattr を実装する方法

Python では、オブジェクトはクラス定義で定義されていない動的属性を持つことができます。この動的な動作は、オブジェクトの属性検索が失敗したときに呼び出される getattr メソッドによって実現されます。残念ながら、モジュールは本質的に __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>

    xxx
  1. メソッドはクラスで排他的に検索されます。TypeError: can組み込み/拡張タイプ 'module' の属性を設定できません
  2. 考えられる解決策

ラッパー メソッド:

sys.modulesディクショナリは柔軟性があり、モジュールへのアクセスをインターセプトするラッパーの作成が可能です。ただし、これはモジュールを介したメソッドへのアクセスのみをサポートしており、モジュール自体内ではサポートされていません。さらに、毎回新しいインスタンスを作成すると、グローバル アプローチと比較して異なる動作が発生する可能性があります。

クラス置換:

Guido van Rossum が推奨するハック的なアプローチこれには、クラスを作成し、sys.modules[__name__] をそのクラスのインスタンスに置き換えることが含まれます。これにより、__getattr__/__setattr__/__getattribute__ の使用が可能になります。ただし、次の注意事項があります。

置換後は、他のすべてのモジュール属性が失われます。
  • from module import * の場合、
  • all
  • を定義する必要があります。ワイルドカードのインポートをサポートするクラス。
  • 結論

Python モジュールは __getattr__ をネイティブにサポートしていませんが、推奨されるソリューションは、モジュールに対して同様の動的属性解決を実現するための回避策を提供します。

以上がPython でモジュールの getattr 機能を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。