python装飾器の一般的な使用方法の分析

2782 ワード

この例では、python装飾器の一般的な使用方法について説明します.皆さんの参考にしてください.具体的には以下の通りです.
pythonの装飾器は、spring AOPのような機能を実現するために使用することができます.同じように、ある方法が実行される前に何をしたのか、実行された後に何をしたのか、あるいはログを記録したり、実行した時間などを記録したりすることができます.さらに、これを使って権限ブロックをしたりすることもできます.pythonの装飾モードを2つの側面から説明します.
1.一般的な方法の装飾
2.classクラスでのメソッドの装飾にパラメータを与える必要がない場合
3.classクラスでのメソッドの装飾にパラメータを与える必要がある場合
一、普通の方法の装飾.例えば、一つの方法が実行する時間を計算する.

#coding:utf-8
import time
def timeit(func):
  def wrapper(*args, **kv):
    start = time.clock()
    print '    '
    func(*args, **kv)
    end =time.clock()
    print '    :', end - start
  return wrapper
@timeit
def foo():
  print 'in foo()'
if __name__=='__main__':
  foo()


実行結果:
in foo()の実行開始にかかる時間:6.55415628267 e-05
時間差が計算されていることがわかります.普通の方法のように、1つの関数に書いて実現するのではありません.
二、class類における方法の装飾に対して、パラメータを与える必要がない場合

#coding:utf-8
import time
def timeit(func):
  def wrapper(*args, **kv):
    start = time.clock()
    print '    '
    func(*args, **kv)
    end =time.clock()
    print '    :', end - start
  return wrapper
class MySpendTime(object):
  def __init__(self):
    pass
  @timeit
  def foo(self):
    print 'in foo()'
spendtime=MySpendTime()
spendtime.foo()


実行結果:
in foo()の実行開始にかかる時間:4.42208134735 e-05
三、class類における方法の装飾に対して、パラメータを与える必要がある場合

#coding:utf-8
'''
Created on 2012-11-1
@author: yihaomen.com
'''
def UpdateUI(msg, step):
  print u"  :", msg
  print u"  :  %s  " % step
  def dec(func):
    def wapper(self, *args, **kwargs):
      func(self,*args, **kwargs)
    return wapper
  return dec
class Command(object):
  def Excute(self):
    self.Work1st()
    self.Work2nd()
    self.Work3rd()
  @UpdateUI("     ","1")
  def Work1st(self):
    print "Work1st"
  @UpdateUI("     ", 2)
  def Work2nd(self):
    print "Work2nd"
  @UpdateUI("     ", 3)
  def Work3rd(self):
    print "Work3rd"
if __name__=="__main__":
  command = Command()
  command.Excute()


実行結果:
内容:第1ステップ開始:第1ステップ開始内容:第2ステップ開始:第2ステップ開始内容:第2ステップ開始内容:第3ステップ開始:第3ステップ開始Work 1 st Work 2 nd Work 3 rd
Pythonに関する詳細は、「Pythonデータ構造とアルゴリズムチュートリアル」、「Python Socketプログラミングテクニックまとめ」、「Python関数使用テクニックまとめ」、「Python文字列操作テクニックまとめ」、「Python入門と進級クラシックチュートリアル」のトピックを参照してください.
ここではPythonプログラムの設計に役立つことを願っています.