zoukankan      html  css  js  c++  java
  • 装饰器

    函数初识:
    函数名的命名规则:和变量相同===1:数字、字母、下划线任意组合,不能使用空格、连字符、标点符号、引号或其他字符。==》不能是中文,也不能以数字开头
        2:不可以是Python中的关键字
        3:也不能随意起名,要具有可描述性,
        4:长度没有限制,但是也不应太过冗长
        5:可以使用官方推荐的字体:驼峰体,下划线体
        
    def caculate(a,b):    # def关键字:definition + 函数名    # 注意:函数要有返回值
        res = a+b
        return res
        
    
    函数:
    本质:封装一个功能
    作用/优点:
        重复代码少,可读性强,复用性强
    执行顺序:
        代码从上到下执行的过程中遇到函数时只读取函数名,但是并不执行函数内的程序,而是被调用时才执行
    
    
        
        
    装饰器初识:
    作用/功能:在不改变原函数名的情况下,为函数增添额外的功能
    import functools
    
    def wrapper(func):
        @functools.wraps(func)    # functools.wraps()作用:保留原函数的信息,将装饰器伪装的更像原函数
        def inner(*args,**kwargs):
            """被装饰之前"""
            ret = func(*args,**kwargs)
            """被装饰之后"""
            return ret
        def inner
        
    
    
    @wrapper
    def func(*args,**kwargs):    # 在函数定义时/形参阶段:*args,**kwargs接收所有参数:*arg会把多出来的位置参数转化为tuple;**kwarg会把关键字参数转化为dict
        print("我是func")
        flag = True
        return flag
        
    func(*args,**kwargs)    
        
    ###########################################################
    
    
    
    
    多个装饰器装饰一个函数
    def wrapper1(f):  # f == func,传进来的函数名
        def inner1(*args,**kwargs):
            """被装饰之前"""
            print('wrapper1 ,before func')     # 3
            f()                                # 4
            """被装饰之后"""
            print('wrapper1 ,after func')      # 5
        return inner1
    
    
    def wrapper2(f):  # f == inner1
        def inner2(*args,**kwargs):
            print('wrapper2 ,before func')  # 2
            f()
            print('wrapper2 ,after func')      # 6
        return inner2
    
    
    def wrapper3(f):      # f==inner2
        def inner3(*args,**kwargs):
            print('wrapper3 ,before func')  # 1
            f()                          
            print('wrapper3 ,after func')   # 7
        return inner3
    
    
    @wrapper3  # f = wrapper3(func)  ==>f = wrapper3(inner2)==>里面的func == inner2  外面的func == inner3
    @wrapper2  # f = wrapper2(func)  ==>f = wrapper2(inner1)==>里面的func == inner1  外面的func == inner2
    @wrapper1  # f = wrapper1(func)  ==>f = wrapper(func)里面的func == 函数名func  外面的func == inner1
    def func():        
        print('i am in func')
        flag = True
        return flag
    
    f()  
    
    
    """
    wrapper3 ,before func
    wrapper2 ,before func
    wrapper1 ,before func
    i am in func
    wrapper1 ,after func
    wrapper2 ,after func
    wrapper3 ,after func
    """
    
    
    
    ##############################################
    带参数的装饰器==>三层函数嵌套
    def timmer(*args,**kwargs):
        def wrapper(f):                    # f == func1
            def inner(*args,**kwargs):
               """被装饰之前"""
               ret = f(*args,**kwargs)    # 执行函数func1并得到结果
               """被装饰之后"""
               return ret
            return inner
        return wrapper
    
    
    @timmer(*args,**kwargs)  # 两步:1,函数名加括号==》执行该函数,timmer(*args,**kwargs) --> wrapper 2,@wrapper 装饰器==>wrapper(func1)
    def func1():
        print("执行函数func1")
    
    
    @timmer(*args,**kwargs)
    def func2():
        print("执行函数func2")
        flag = True
        return flag
        
        
    func1()
    func2()
  • 相关阅读:
    marginleft IE Firefox 浏览器下的不同
    提取HTML代码中文字的C#函数
    分享按钮汇总
    jquery UI集合
    向用户授予对象特权
    oracle中使用聚合函数
    创建对象类型
    jdk1.6.0_01配置系统环境变量
    修改表
    将一个实体映射到多张数据库表
  • 原文地址:https://www.cnblogs.com/thismyblogs/p/9761879.html
Copyright © 2011-2022 走看看