[解決済み] インスタンスメソッドのデコレーターは、クラスにアクセスできますか?
2022-06-29 23:01:04
質問
おおよそ以下のような内容です。基本的には、インスタンスメソッドの定義で、インスタンスメソッドに使用されるデコレータから、インスタンスメソッドのクラスにアクセスする必要があります。
def decorator(view):
# do something that requires view's class
print view.im_class
return view
class ModelA(object):
@decorator
def a_method(self):
# do some stuff
pass
そのままのコードでは
AttributeError: 'function' オブジェクトは 'im_class' という属性を持ちません。
似たような質問/回答がありました Pythonのデコレータは、関数がクラスに属していることを忘れさせます。 と Pythonのデコレータでクラスを取得する - がありますが、これらは実行時に最初のパラメータを取得してインスタンスを取得するワークアラウンドに依存しています。 私の場合、私はそのクラスから得られた情報に基づいてメソッドを呼び出すので、呼び出しが来るのを待つことはできません。
どのように解決するのか?
Python 2.6以降を使用している場合、クラスデコレータを使用することができます。
def class_decorator(cls):
for name, method in cls.__dict__.iteritems():
if hasattr(method, "use_class"):
# do something with the method and class
print name, cls
return cls
def method_decorator(view):
# mark the method as something that requires view's class
view.use_class = True
return view
@class_decorator
class ModelA(object):
@method_decorator
def a_method(self):
# do some stuff
pass
メソッドデコレーターは "use_class" 属性を追加することでメソッドを注目すべきものとしてマークします - 関数とメソッドはオブジェクトでもあるので、追加のメタデータを付けることができます。
クラスが作成された後、クラスデコレーターはすべてのメソッドに目を通し、マークされたメソッドに対して必要なことを行います。
もしすべてのメソッドに影響を与えたいのであれば、 メソッド・デコレータを省略してクラス・デコレータを使用することができます。
関連
-
Evidentlyを用いたPythonデータマイニングによる機械学習モデルダッシュボードの作成
-
[解決済み】 AttributeError("'str' object has no attribute 'read'")
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み] リスト項目の出現回数を数えるにはどうしたらいいですか?
-
[解決済み] インスタンスのクラス名を取得する?
-
[解決済み] print関数の出力をフラッシュする(pythonの出力をバッファリング解除する)にはどうすればよいですか?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?
-
[解決済み] Pythonのsuper()は多重継承でどう動くのか?
-
[解決済み] print()を使用してクラスのインスタンスを表示するには?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
ピロウズ画像色処理の具体的な活用方法
-
Python Decorator 練習問題
-
PyQt5はユーザーログインGUIインターフェースとログイン後のジャンプを実装しています。
-
PythonによるExcelファイルの一括操作の説明
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み] パラメータを持つデコレータ?
-
[解決済み] Pythonのクラスのメソッドのリストを取得するにはどうすればよいですか?