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()
  • 相关阅读:
    live555源码研究(三)------UsageEnvironment类
    live555源码研究(二)------TaskScheduler类
    live555源码研究(一)------live555MediaServer的启动过程和基本类图
    (转)视频监控相关文章
    【流媒體】live555—VS2008 下live555编译、使用及测试
    【转】PostgreSQL IP地址访问配置
    red5研究(一):下载,工程建立、oflaDemo安装、demo测试
    SVN服务器的搭建和使用
    【转】linux下cvs配置
    【转】js正则表达式语法
  • 原文地址:https://www.cnblogs.com/xiaobin12126/p/8417864.html
Copyright © 2011-2022 走看看