デコレータ¶
関数などに機能を追加するシンタックスシュガーとして、デコレータがあります。 シンタックスシュガー、あるいは糖衣構文という言葉が分からない場合は別途学習しておいてください。 (Python に限った言葉ではなく、プログラミング一般で使われるため)
- PEP 318: Decorators for Functions and Methods
日本語での一通りの解説はこちらの記事を参照してください。
組み込みデコレータ¶
@classmethod と @staticmethod という二つのデコレータは Python 2.2 以上で使えます。 使い方はこちらのブログを確認してください。
decorator-sample.py として、これらを組み合わせて使ってみます。 それぞれのメソッドの引数の違いに注意しましょう。
class A(object):
@classmethod
def name(cls, msg):
print("Greetings from classmethod.")
cls.hello(msg)
class B(A):
@staticmethod
def hello(msg):
print("Hello", msg, " from Class-B")
class C(A):
@staticmethod
def hello(msg):
print("Hello", msg, " from Class-C")
B.name("Alice")
C.name("Bob")
実行結果
$ python decorator-sample.py
Greetings from classmethod.
Hello Alice on Class-B
Greetings from classmethod.
Hello Bob on Class-C
デコレータのいろいろ¶
いくつかの参考リンクを列挙しておきます。 デコレータについて更なる学習を進めるならば目を通しておきましょう。
Python Decorator Library - wiki.python.org: | |
---|---|
様々なデコレータの例が掲載されています。 自分で実装するときには目を通してみるとよいでしょう。欲しいものが既にあるかもしれません。 | |
10.2. functools — Higher order functions and operations on callable objects (公式ドキュメント): | |
自分で実装するときは、 functools モジュールの wraps デコレータを使うようにしましょう。 functools モジュールは Python 2.5 から利用できます。 | |
Fabric post-run processing Python decorator - saltycrane.com: | |
Fabric のタスクに追加処理を与えるためにもデコレータは有効です。 Fabric に関しては fabric を使う を読んでみてください。 | |
What are common uses of Python decorators? - quora.com: | |
よくある使われ方は Quora などの Q&A を確認してみましょう。 フィボナッチ数列やメモ化 (memoize) を知らない場合は自分で調べておいてください。 | |
the history of the process of adding decorators to Python - wiki.python.org: | |
デコレータの構文が現在のものに決まった経緯は Wiki にまとめられています。 暇なときに読んでみると良いかもしれません。 |