質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

20214閲覧

Python でclass内にdecoratorを持たせたい

super_hogehoge

総合スコア29

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

3クリップ

投稿2016/10/20 09:16

編集2016/10/21 01:51

###前提・実現したいこと
Python でclass内にdecoratorを持たせたい

###発生している問題・エラーメッセージ

Traceback (most recent call last): File "deco2.py", line 1, in <module> class MyClass(object): File "deco2.py", line 12, in MyClass @decorator TypeError: decorator() takes exactly 2 arguments (1 given)

###該当のソースコード

python

1class MyClass(object): 2 def __init__(self): 3 self.my_var = "my_var" # 追加しました 4 # pass 5 6 def decorator(self, func): 7 def inner(*args, **kwargs): 8 print "pre func" 9 print self.my_var # 追加しました 10 func(*args, **kwargs) 11 print "after_func" 12 return inner 13 14 @decorator #ここでエラーになります 15 def print_hoge(self): 16 print "hoge" 17 18 19temp = MyClass() 20temp.print_hoge()

###試したこと

python

1def decorator(func): 2 def inner(*args, **kwargs): 3 print "pre func" 4 func(*args, **kwargs) 5 print "after_func" 6 return inner 7 8 9@decorator 10def print_hoge(): 11 print "hoge" 12 13print_hoge() 14 15>>pre_func 16>>hoge 17>>after_func

###補足情報(言語/FW/ツール等のバージョンなど)
いつも参考にさせていただいております。
非常に簡単な質問かも知れないのですが、実力が足りず解決方法が分からない為教えてください。

【試したこと】の欄のソースでは上手くいくのに、class内に入れた際うまく行きません。

よろしくお願い致します。

hoboki👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

decoratorメソッドのself引数を消すといかがですか。

python

1class MyClass(object): 2 def __init__(self): 3 pass 4 5 def decorator(func): 6 def inner(*args, **kwargs): 7 print "pre func" 8 func(*args, **kwargs) 9 print "after_func" 10 return inner 11 12 @decorator 13 def print_hoge(self): 14 print "hoge" 15 16 17temp = MyClass() 18temp.print_hoge()

self 等にアクセスしたい場合は、以下のようにします。

python

1#coding: utf-8 2 3class MyClass(object): 4 def __init__(self): 5 self.my_var = "my_var" # 追加しました 6 7 def decorator(func): 8 def inner(self, *args, **kwargs): 9 print "pre func" 10 print self.my_var # 追加しました 11 func(self, *args, **kwargs) 12 print "after_func" 13 return inner 14 15 @decorator 16 def print_hoge(self, *args, **kwargs): 17 print "hoge" 18 19 20temp = MyClass() 21temp.print_hoge()

selfがなくて良い理由ですが、上のコードは実質以下のコードと同義です。
selfを使うのはあくまでselfが定義しているメソッド内で、今回の例ではdecoratorメソッドは素直に参照できます。

python

1 # デコレータをつけないバージョン 2 def print_hoge(self, *args, **kwargs): 3 print "hoge" 4 print_hoge = decorator(print_hoge) 5 # print_hoge = self.decorator(print_hoge) selfをつけるとエラー。

投稿2016/10/20 11:40

編集2016/10/21 05:01
toritoritorina

総合スコア972

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

super_hogehoge

2016/10/21 01:47

ご回答ありがとうございます!! ただ、すいません、私の例が悪かったです。確かに教えていただいたコードで出力されますが、self引数を消すと、 ```python class MyClass(object): def __init__(self): self.my_var = "my_var" # 追加しました pass def decorator(func): def inner(*args, **kwargs): print "pre func: " print self.my_var # 追加しました func(*args, **kwargs) print "after_func " return inner @decorator def print_hoge(self): print "hoge" temp = MyClass() temp.print_hoge() ``` のようなclass内部の変数にアクセスできず、selfを付けると@self.decoratorと書いた 箇所でエラーになってしまうので困っていました。 例が適切な物ではなくご迷惑をお掛けしました… 上記問題についても知見をお持ちでご教授いただけると非常に助かります。 お手数をお掛けしますがよろしくお願い致します。
super_hogehoge

2016/10/21 03:20

ご回答ありがとうございます! 正直、私の力不足でclass内methodなのにself無くてよいの?等しっくり来ていないところ もあるのですが 問題は解決していただけたのでご回答をベストアンサーとさせていただきます。 迅速に回答していただきとても助かりました。ありがとうございました!
super_hogehoge

2016/10/21 06:45

>selfを使うのはあくまでselfが定義しているメソッド内で、今回の例では >decoratorメソッドは素直に参照できます。 なるほど・・・てっきりclass内の関数は全てselfを引数に持たないといけないのかと 誤認していました。回答して下さった上にこちらの疑問にフォローしていただき 非常にすっきり問題を解決することができました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問