Pythonにおける装飾器の使用
4799 ワード
cs 20 siを勉強していて、飾り器に出会ったので、ここではデコレーションの使い方を紹介します.主な内容の根拠http://blog.apcelent.com/python-decorator-tutorial-with-example.html
Pythonでは、すべてのものが対象であり、一つの関数は変数に割り当てられ、別の関数に伝達されたり、他の関数に戻り値として返されたりします.Pythonの装飾器は関数であり、受容関数はパラメータとして、別の関数で戻り値を返します.
関数装飾
method装飾器
method装飾器は種類のmethodをクラスの属性とすることができます.
Its a cool place to live in.
SF
クラス装飾器
どのようにして値を返したいのかを関数にすると、フリントデコレーションが使用されますが、デコレーションの戻り値がオブジェクトである場合は、一つのクラスデコラレータが必要です.
decorator initialised clast decorator terminated
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_funcmethod装飾器
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