zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    转载: JS 中 new 操作符
    转载: js的值,对象,原型
    php setcookie(name, value, expires, path, domain, secure) 参数详解
    转载:js数组对象操作
    转载: js数组与 json 的区别
    转载: js的Prototype属性 解释及常用方法
    行人检测程序对接景区测试人数比对数据库切换时间不准确排查
    TSINGSEE青犀视频行人检测集成票务系统读取票务系统数据库为空的问题
    EasyWasmPlayer播放视频报错Uncaught (in promise)DOMException
    名胜景区部署TSINGSEE青犀视频监控具备哪些现实意义?
  • 原文地址:https://www.cnblogs.com/xiaobin12126/p/8417864.html
Copyright © 2011-2022 走看看