python 装饰器的详细描述见 https://zhaochj.github.io/2016/05/05/2016-05-05-%E5%B8%A6%E5%8F%82%E6%95%B0%E7%9A%84%E8%A3%85%E9%A5%B0%E5%99%A8/
一:函数装饰函数
def wrapFun(func):
def inner(a, b):
print('function name:', func.__name__)
r = func(a, b)
return r
return inner
@wrapFun
def myadd(a, b):
return a + b
print(myadd(2, 3))
带参数的装饰器
def wrapFun_with_args(my_args):
def wrapFun(func):
def inner(a, b):
print("my_args: ",my_args)
print('function name:', func.__name__)
r = func(a, b)
return r
return inner
return wrapFun
@wrapFun_with_args(my_args="my_args")
def myadd(a, b):
return a + b
print(myadd(2, 3))
二:函数装饰类
def wrapClass(cls):
def inner(a):
print('class name:', cls.__name__)
return cls(a)
return inner
@wrapClass
class Foo():
def __init__(self, a):
self.a = a
def fun(self):
print('self.a =', self.a)
m = Foo('xiemanR')
m.fun()
带参数装饰器
def wrapclass_with_args(my_args):
def wrapClass(cls):
def inner(a):
print("my_args: ", my_args)
print('class name:', cls.__name__)
return cls(a)
return inner
return wrapClass
@wrapclass_with_args(my_args="my_args")
class Foo():
def __init__(self, a):
self.a = a
def fun(self):
print('self.a =', self.a)
m = Foo('xiemanR')
m.fun()
三:类装饰函数
class ShowFunName():
def __init__(self, func):
self._func = func
def __call__(self, a):
print('function name:', self._func.__name__)
return self._func(a)
@ShowFunName
def Bar(a):
return a
print(Bar('xiemanR'))
带参数装饰器
四:类装饰类
class ShowClassName(object):
def __init__(self, cls):
self._cls = cls
def __call__(self, a):
print('class name:', self._cls.__name__)
return self._cls(a)
@ShowClassName
class Foobar(object):
def __init__(self, a):
self.value = a
def fun(self):
print(self.value)
a = Foobar('xiemanR')
a.fun()
五:函数装饰类方法
#coding=utf-8
import time
def cal_time(func_name):
def inner(self, *args, **kwargs):
time1 = time.time()
func_name(self, *args,**kwargs)
time2 = time.time()
print("耗时 %s" % (time2 - time1))
return inner
class A:
@cal_time
def simulate_sleep(self):
print("a")
time.sleep(3)
print("b")
if __name__ == '__main__':
A().simulate_sleep()
带参数的装饰器
#coding=utf-8
import time
def cal_time_with_args(my_args):
def cal_time(func_name):
def inner(self, *args, **kwargs):
print("my_args", my_args)
time1 = time.time()
func_name(self, *args,**kwargs)
time2 = time.time()
print("耗时 %s" % (time2 - time1))
return inner
return cal_time
class A:
@cal_time_with_args(my_args="my_args")
def simulate_sleep(self):
print("a")
time.sleep(3)
print("b")
if __name__ == '__main__':
A().simulate_sleep()