[解決済み】クラスメソッドデコレーターでself引数?
2022-04-04 03:38:22
質問
クラスメソッド上のデコレーターにクラスフィールドを引数として渡すにはどうしたらよいですか? やりたいことは、以下のようなことです。
class Client(object):
def __init__(self, url):
self.url = url
@check_authorization("some_attr", self.url)
def get(self):
do_work()
を渡すと、self が存在しないと文句を言われる。
self.url
をデコレータに渡すことができます。 これを回避する方法はあるのでしょうか?
解決方法は?
クラス定義時にインスタンス属性を渡すのではなく、実行時にチェックするようにします。
def check_authorization(f):
def wrapper(*args):
print args[0].url
return f(*args)
return wrapper
class Client(object):
def __init__(self, url):
self.url = url
@check_authorization
def get(self):
print 'get'
>>> Client('http://www.google.com').get()
http://www.google.com
get
デコレータはメソッドの引数をインターセプトします。最初の引数はインスタンスなので、そこから属性を読み取ります。属性名を文字列としてデコレータに渡すことができます。
getattr
属性名をハードコードしたくない場合。
def check_authorization(attribute):
def _check_authorization(f):
def wrapper(self, *args):
print getattr(self, attribute)
return f(self, *args)
return wrapper
return _check_authorization
関連
-
ピロウズ画像色処理の具体的な活用方法
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】Flaskのテンプレートが見つからない【重複あり
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] Pythonの@propertyデコレーターはどのように機能するのでしょうか?
-
[解決済み] Pythonのsuper()は多重継承でどう動くのか?
-
[解決済み】Pythonの「private」メソッドは、なぜ実際にはprivateではないのですか?
-
[解決済み】Pythonのメソッドで明示的に "self "引数が必要な理由とは?
最新
-
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コンテナのための組み込み汎用関数操作
-
Python関数の高度な応用を解説
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
Python Pillow Image.save jpg画像圧縮問題
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?