Pythonにおける装飾器の使用

4799 ワード

cs 20 siを勉強していて、飾り器に出会ったので、ここではデコレーションの使い方を紹介します.主な内容の根拠http://blog.apcelent.com/python-decorator-tutorial-with-example.html
Pythonでは、すべてのものが対象であり、一つの関数は変数に割り当てられ、別の関数に伝達されたり、他の関数に戻り値として返されたりします.Pythonの装飾器は関数であり、受容関数はパラメータとして、別の関数で戻り値を返します.
関数装飾
import time

def timetest(input_func):
    def timed(*args, **kwargs):
        """ caculate time"""
        start_time = time.time()
        result = input_func(*args, **kwargs)
        end_time = time.time()
        print "Method Name - {0}, Args - {1}, Kwargs - {2}, Excution Time - {3}".format(
            input_func.__name__,
            args,
            kwargs,
            end_time - start_time
        )
        return result
    return timed

@timetest
def foorbar(*args, **kwargs):
    time.sleep(0.3)
    print "inside foorbar"
    print args, kwargs

foorbar(["hello world"], foo=2, bar=5)
関数foorbarを装飾器timetestに渡し、パラメータinput_func
method装飾器
method装飾器は種類のmethodをクラスの属性とすることができます.
def method_decorator(method):
    def inner(city_instance):
        if city_instance.name == "SFO":
            print "Its a cool place to live in."
        else:
            method(city_instance)
    return inner

class City():
    def __init__(self, name):
        self.name = name

    @method_decorator
    def print_test(self):
        print self.name
p1 = City("SFO")
p1.print_test()
出力
Its a cool place to live in.
p1 = City("SF")
p1.print_test()
出力
SF
クラス装飾器
どのようにして値を返したいのかを関数にすると、フリントデコレーションが使用されますが、デコレーションの戻り値がオブジェクトである場合は、一つのクラスデコラレータが必要です.
class decoclass():
    def __init__(self, f):
        self.f = f
    def __call__(self):
        # before f actions
        print 'decorator initialised'
        self.f()
        print "decorator terminated"
        # after f actions

@decoclass
def kclass():
    print "class"

kclass()
出力
decorator initialised clast decorator terminated