[解決済み] モジュール上の __getattr__
質問
に相当するものをどのように実装すればよいのでしょうか?
__getattr__
をクラスやモジュールに実装できますか?
例
モジュールの静的定義属性に存在しない関数を呼び出す場合、そのモジュールにクラスのインスタンスを作成し、モジュールの属性検索で失敗したのと同じ名前のメソッドをそのモジュール上で呼び出したいと思います。
class A(object):
def salutation(self, accusative):
print "hello", accusative
# note this function is intentionally on the module, and not the class above
def __getattr__(mod, name):
return getattr(A(), name)
if __name__ == "__main__":
# i hope here to have my __getattr__ function above invoked, since
# salutation does not exist in the current namespace
salutation("world")
どちらが与えるか。
matt@stanley:~/Desktop$ python getattrmod.py
Traceback (most recent call last):
File "getattrmod.py", line 9, in <module>
salutation("world")
NameError: name 'salutation' is not defined
どのように解決するのですか?
しばらく前に、Guido は、すべての特別なメソッドの検索が
をバイパスする新しいスタイルのクラス
__getattr__
と
__getattribute__
. Dunder のメソッドは、以前はモジュール上で動作していました。
__enter__
と
__exit__
の前に、そのトリックを
壊れた
.
最近、いくつかの歴史的な機能がカムバックしました。
__getattr__
その中で、既存のハック (モジュールが自分自身をクラスで置き換えることで
sys.modules
のクラスで自分自身を置き換える) は、もはや必要ないはずです。
Python 3.7+では、1つの明白な方法を使うだけです。 モジュールの属性アクセスをカスタマイズするには、モジュールに
__getattr__
関数を定義します。この関数は一つの引数 (属性の名前) を受け取り、計算された値を返すか、または
AttributeError
:
# my_module.py
def __getattr__(name: str) -> Any:
...
これはまた、"from" インポートへのフック、すなわち、次のようなステートメントに対して動的に生成されたオブジェクトを返すことができるようになります。
from my_module import whatever
.
これに関連して、モジュール getattr と一緒に
__dir__
関数をモジュールレベルで定義して
dir(my_module)
. 参照
PEP 562
を参照してください。
関連
-
任意波形を生成してtxtで保存するためのPython実装
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】Flaskのテンプレートが見つからない【重複あり
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] フルパスでモジュールをインポートするには?
-
[解決済み] Pythonモジュールをアンロード(再ロード)するにはどうしたらいいですか?
-
[解決済み] PythonモジュールとPythonパッケージの違いは何ですか?
-
[解決済み] Pythonモジュールのソースの場所を見つけるにはどうしたらいいですか?
-
[解決済み] __getattr__ と __getattribute__ の違い
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
パッケージングツールPyinstallerの使用と落とし穴の回避
-
Pythonショートビデオクローラーチュートリアル
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】NameError: 名前 'self' が定義されていません。
-
[解決済み] 現在のモジュールでsetattr()を呼び出すにはどうすればよいですか?