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

    1,什么是装饰器

    所谓的装饰器,其实就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改。

    说到装饰器的那就要提一下闭包这个概念了

    装饰器本质---闭包

    当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的变量,且返回的这个函数在外部被执行就产生了闭包.闭包是一个环境,具体指的就是外部函数--高阶函数。说白了就是一个环境,能够读取其他函数内部的变量

    闭包形成的条件

    1,存在嵌套关系,即有内部函数,外部函数

    2,内部函数引用外部变量

    3,外部函数返回内部函数

    2,简单的装饰器

    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    
    # 定义一个函数
    def PrintHello():
        print('Hello the world!')
    
    PrintHello()
    print('----------------------------------')
    # 想要让这个函数多打印一句话,但是又不能改变这个函数,这个时候就需要定义一个装饰器
    def Decorator(func):
        def inner():
            print('这是需要加的话')
            func()
        return inner
    
    hello = Decorator(PrintHello)
    hello()

    结果:

    3,美化后的装饰器

    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    '''
    # 装饰器
    def Decorator(func):
        def inner():
            print('这是需要加的话')
            func()
        return inner
    
    # 定义一个函数
    @Decorator #定义好装饰器后,只需要在被装饰的函数上写@装饰器名字就可以了
    def PrintHello():
        print('Hello the world!')
    
    PrintHello()

    这里的@Decorator就好比 hello = Decorator(PrintHello)

    4,带参数的装饰器

    单个参数

    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    
    # 装饰器
    def Decorator(func):
        def inner(args):
            print('这是需要加的话')
            func(args)
        return inner
    
    # 定义一个函数
    @Decorator #定义好装饰器后,只需要在被装饰的函数上写@装饰器名字就可以了
    def PrintHello(args):
        print(f'{args}:Hello the world!')
    
    PrintHello('Army')

    多个参数

    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    
    # 装饰器
    def Decorator(func):
        def inner(*args,**kwargs):
            print('这是需要加的话')
            func(*args,**kwargs)
        return inner
    
    # 定义一个函数
    @Decorator #定义好装饰器后,只需要在被装饰的函数上写@装饰器名字就可以了
    def PrintHello(args):
        print(f'{args}:Hello the world!')
    
    @Decorator #定义好装饰器后,只需要在被装饰的函数上写@装饰器名字就可以了
    def PrintHello2(args,args2):
        print(f'{args}:Hello the world! {args2}')
    
    PrintHello('Army')
    PrintHello2('Army','123')

    不论你在什么时候开始,重要的是开始之后就不要停止。 不论你在什么时候结束,重要的是结束之后就不要悔恨。
  • 相关阅读:
    修改python的pip下载源
    MySQL_Sql_打怪升级_进阶篇_进阶12: DDL常见数据类型
    【Xshell】SFTP子系统申请已拒绝,请确保SSH连接的SFTP子系统设置有效
    MySQL_Sql_打怪升级_进阶篇_进阶11: DDL数据定义语言
    MySQL_Sql_打怪升级_进阶篇_进阶10: DML数据操纵语言
    MySQL_Sql_打怪升级_进阶篇_进阶9:联合查询
    MySQL_Sql_打怪升级_进阶篇_ 进阶8:分页查询
    MySQL_Sql_打怪升级_进阶篇_进阶7:子查询
    MySQL_Sql_打怪升级_进阶篇_进阶6:连接查询
    Ubuntu出现E: Failed to fetch
  • 原文地址:https://www.cnblogs.com/yunhgu/p/13614493.html
Copyright © 2011-2022 走看看