Python之装饰器

一、装饰器

1.1 简单的装饰器

 1 import time
 2 def func():
 3     print('嘻嘻更健康')
 4 def timmer(f):
 5     def inner():
 6         start_time = time.time()
 7         time.sleep(0.1)
 8         f()
 9         end_time = time.time()
10         print('----> 执行效率%s' % (end_time - start_time))
11     return inner
12 func = timmer(func)  # inner
13 func() # inner()
View Code

1.2语法糖

 1 import time
 2 def timmer(f):
 3     def inner():
 4         start_time = time.time()
 5         time.sleep(0.1)
 6         f()
 7         end_time = time.time()
 8         print('----> 执行效率%s' % (end_time - start_time))
 9     return inner
10 @timmer  # func = timmer(func)
11 def func():
12     print('嘻嘻更健康')
13 func() # inner()
View Code

1.3函数带参数的装饰器

 1 import time
 2 def timmer(f):
 3     def inner(*args,**kwargs):
 4         start_time = time.time()
 5         time.sleep(0.1)
 6         f(*args,**kwargs)
 7         end_time = time.time()
 8         print('----> 执行效率%s' % (end_time - start_time))
 9     return inner
10 @timmer   # func1 = timmer(func1)
11 def func1(a,b):
12     print('%s和%s嘻嘻更健康' %(a,b))
13 func1('萌哥','杀毒软件')
View Code

1.4 带返回值的装饰器

 1 import time
 2 def timmer(f):
 3     def inner(*args,**kwargs):
 4         start_time = time.time()
 5         time.sleep(0.1)
 6         ret = f(*args,**kwargs)  # 222
 7         end_time = time.time()
 8         print('----> 执行效率%s' % (end_time - start_time))
 9         return ret
10     return inner
11 
12 @timmer  # func = timmer(func)
13 def func(a):
14     return 222
15 print(func('萌哥'))
View Code

1.5 通用装饰器

 1 def wrapper(func):
 2     def inner(*args,**kwargs):
 3         '''执行函数前操作'''
 4         ret = func(*args,**kwargs)
 5         '''执行函数后的操作'''
 6         return ret
 7     return inner
 8 
 9 @wrapper
10 def func():
11     print(66)
12 func()
View Code

1.6 查看函数信息

 1 from functools import wraps
 2 
 3 def deco(func):
 4     @wraps(func) #加在最内层函数正上方
 5     def wrapper(*args,**kwargs):
 6         return func(*args,**kwargs)
 7     return wrapper
 8 
 9 @deco
10 def index():
11     '''哈哈哈哈'''
12     print('from index')
13 
14 print(index.__doc__)
15 print(index.__name__)
View Code

二、开放封闭原则

1.对扩展是开放的
必须允许代码扩展、添加新功能。
2.对修改是封闭的
防止误操作

三、带参数的装饰器

 1 flag =False
 2 def outer(flag):
 3     def timer(func):
 4         def inner(*args,**kwargs):
 5             if flag:
 6                 print('''执行函数之前要做的''')
 7             re = func(*args,**kwargs)
 8             if flag:
 9                 print('''执行函数之后要做的''')
10             return re
11         return inner
12     return timer
13 
14 @outer(flag)
15 def func():
16     print(111)
17 func()
View Code

四、多个装饰器

def wrapper1(func):
    def inner():
        print('wrapper1 ,before func')
        func()
        print('wrapper1 ,after func')
    return inner

def wrapper2(func):
    def inner():
        print('wrapper2 ,before func')
        func()
        print('wrapper2 ,after func')
    return inner

@wrapper2
@wrapper1
def f():
    print('in f')

f()
原文地址:https://www.cnblogs.com/xiaobin12126/p/8417864.html