版权声明:QQ群:796245415 个人技术交流,禁止用作商业活动 https://blog.csdn.net/chen498858336/article/details/83795015
# coding =utf-8
import datetime
import time
# """method.decorator方法装饰器""""
def timer(fn):
def wrapper(*args, **kwargs):
start = datetime.datetime.now()
fn_foo = fn(*args, **kwargs)
delta = (datetime.datetime.now() - start).total_seconds()
if delta > 2:
print ("{}:{}s".format(fn.__name__, delta))
return fn_foo
return wrapper
@timer
def add(x, y):
time.sleep(3)
return x + y
#foo = timer(add) 装饰器@timer这个函数干了什么第一步传入一个方法add,返回一个wrapper这里我写的用foo比较抽象其实就是一个wrapper
#foo(4, 6) # 第二步@timer干了什么解构参数啊,给wapper对应位置args,kwargs传参,两步理解简化思维
print(add(4, 6))
# wrapper =timer(fn)
# wrapper(*args, **kwargs)
# """class.method decorator类方法装饰器"""
def decorator(fn):
def wrapper(self,var):
fn_foo = fn(self,var)
return fn_foo
return wrapper
class Foo(object):
def __init__(self, name):
self.age = 36
self.name = name
@decorator
def fn(self, string):
print "i am class.fn that be decorated:" + string
Foo('zs').fn('variable')
# part3: the decorator with args带参数的装饰器
def decorates(*dec_args, **dec_kwgrgs):
def decorator(fn):
def wrapper(*args, **kwargs):
fn_foo = fn(*args, **kwargs)
return fn_foo
return wrapper
return decorator
var1_dec = 'var_dec1'
var2_dec = 'var_dec2'
@decorates(var1_dec, var2_dec)
def fxx(fxx_var1, fxx_var2):
print "decorator.var1:{},decorator.var2:{}####fxx.var1:{},fxx.var2:{}" .format(var1_dec,var2_dec,fxx_var1,fxx_var2)
fxx('tom', 'jack')
# many decorators多装饰器,可以理解为一层由内向外的盒子包裹礼物一样,先最内再最外过程
def deco01(func):
def wrapper(*args, **kwargs):
print("this is deco01 start")
func(*args, **kwargs)
print("deco01 end here")
return wrapper
def deco02(func):
def wrapper(*args, **kwargs):
print("this is deco02 start")
func(*args, **kwargs)
print("deco02 end here")
return wrapper
@deco02
@deco01
def func(x, y):
print "result is {}".format(x+y)
func(3, 4)