zoukankan      html  css  js  c++  java
  • Python基础篇【第九篇】:剖析装饰器

    装饰器:
    装饰器:装饰器的语法以@开头,然后是装饰器函数的名字和可选的参数,紧跟着装饰器声明的是被修饰的函数和装饰函数的可选参数.
    剖析装饰器:
    #!/usr/bin/env python3
    
    '''
    装饰器:装饰器的语法以@开头,然后是装饰器函数的名字和可选的参数,紧跟着装饰器声明的是被修饰的函数和装饰函数的可选参数.
    表现形式:
        def outer():
            def inner():
                print("xxx")
                return test
            return inner
    
        @outer
        def f1():
            pass
        f1()
    '''
    
    # def outer(func):
    #     def inner(*args, **kwargs):
    #         print("123")
    #         ret = func(*args, **kwargs)
    #         #print(ret)
    #         print("456")
    #         return ret
    #     return inner
    
    def outer_0(func):
        def inner(*args, **kwargs):
            print("3.5")
            ret = func(*args, **kwargs)
            print(ret)
            return ret
        return inner
    
    @outer_0
    # @outer
    def index(a1,a2):
        print("这是index函数的内容!")
        return a1 + a2
    
    # ret = index(1,2)
    # print(ret)
    
    index(1,2)
    
    # @outer_0
    # def f1():
    #     print("F1")
    #     return "aaaaa"
    # f1()
    
    '''
    以上装饰器执行经过剖析:
        1.程序开始执行,看到函数"def outer(func)",不会执行,并把此函数放入到内存中去,然后继续往下执行.
        2.看到函数"def outer_0(func):"放入到内存中,不会执行.
        3.往下执行的时候看到@outer_0并会执行此函数,然后解释器会把@outer_0下面的函数"index"当做实参传入到"outer_0"函数中的形参"func"里,所以现在"index" = "func"
            def outer_0(index):                         #拿到index函数,把它当做实参传入到函数中
                def inner(1, 2):                        #第二级函数(它会从一级函数中找到相应的值传进来,而这个inner就会把index的参数给传进来),形体参数对应着实体参数所以*args = 1, ##kwargs = 2
                    print("3.5")                        #自己函数体的值
                    print("这是index函数的内容!")       #从index函数中拿到的值
                    ret = func(1, 2)                    #在这赋值一个变量ret,然而这个变量的值是func(1, 2),why? because func就是index的返回值1, 2就是从index的实体参数
                    print(ret)                          #然后把这个返回值给输出出来
                    return ret                          #最后把返回值给上一层的函数
                return inner
        4.然后将outer_0的返回值重新定义给"index"函数,就是"index"等于"outer_0"的返回值!这一步就相当于重新创建了一个新的"index"函数!而这个新的"index"函数的内容,就是"outer_0"的返回值!("index" = "outer_0"的返回值)
    
    '''
    

      代码执行结果:

    C:UsersAdministratorAppDataLocalProgramsPythonPython35python.exe D:/pycharm/obj/old_boy/day07/装饰器.py
    3.5
    这是index函数的内容!
    3
    
    Process finished with exit code 0
    

      *注:多个执行多个装饰器的时候处理方式。

    @outer
    @outer_0
    def index():
        print("test")
    index()
    #等于一下方式执行:
        (outer*index)*outer_0
        (outer*outer_0)*index
    以乘法的方式进行运算!
    

      

      

  • 相关阅读:
    win8 app scrollviewer ZoomMode
    win8 metro app 不支持 trigger
    WinRT Convert Stream to BitmapImage
    Java深度历险(二)——Java类的加载、链接和初始化(收藏)
    简单的触发器实现
    Java深度历险(一)——Java字节代码的操纵(收藏)
    借用网上大神的一些知识,html5 video 视频播放都兼容(Android,iOS,电脑)
    还原或删除sql server 2008数据库时,经常烩出现: “因为数据库正在使用,所以无法获得对数据库的独占访问权”,终解决方案
    调研《构建之法》指导下的历届作品
    Hibernate 学习笔记一
  • 原文地址:https://www.cnblogs.com/allan-king/p/5494377.html
Copyright © 2011-2022 走看看