美文网首页
装饰器五部曲

装饰器五部曲

作者: 墨颜丶 | 来源:发表于2018-07-18 17:17 被阅读0次

    听说你学不会装饰器?
    Python基础之装饰器五部曲,带你轻轻松松学会装饰器

    装饰器(decorator)是Python中的高级语法,装饰的意思就是动态扩展被装饰对象的功能。

    装饰器可以用于装饰函数、方法、类。

    一 嵌套函数

    
    #定义一个外层函数
    
        def foo():
    
        #定义一个内部函数
    
        def bar():
    
            print("Hello world")
    
    

    函数bar是一个定义在foo函数内部的函数。

    Python中的函数是支持嵌套的,也就是可以在一个函数内部再定义一个函数。

    然后,我们还知道函数是可以当作变量的,于是我们就可以在foo函数中把定义的这个bar函数返回。就像下面这样:

    
    def foo():
    
        #定义一个内部函数
    
        def bar():
    
            print("Hello world")
    
        return bar
    
    func = foo()
    
    func() #func --> bar,这里执行func其实就相当于执行了在foo函数内部定义的bar函数
    
    

    二 闭包形态1

    
    # 闭包形态1
    
    def foo():
    
        name="Andy"  # 外部函数的局部变量
    
        #定义一个内部函数
    
        def bar():
    
            print(name)  # 虽然bar函数中没有定义name变量,但是它可以访问外部函数的的局部变量name 
    
        return bar
    
    func = foo()
    
    func()  # func --> bar --> 除了是一个函数,还包含一个值(它外层函数的局部变量)的引用
    
    

    三 闭包形态2

    
    # 闭包形态2
    
    def foo(name):  # 给一个函数传参也相当于给函数定义了一个局部变量
    
        # 定义了一个内部函数
    
        def bar():
    
            print(name)  #  内部函数同样可以获取到传到外部函数的变量(参数)
    
        return bar
    
    func = foo("Allen")  # 把"Allen"当成参数传入foo函数 --> 其内部定义的bar函数也能拿到这个"Allen"
    
    func()  # func --> bar --> 除了是一个函数,还包含一个值(它外层函数的参数)的引用
    
    

    四 装饰器形态1

    
    # 还是定义一个外层函数
    
    def foo(name):  # 接收的参数是一个函数名
    
        # 定义了一个内部函数
    
        def bar():
    
            print("这是新功能。。。")  # 新功能
    
            name()  # 函数名加()就相当于执行 --> 我传进来愿函数的函数名,这里就相当于执行了原函数
    
        return bar
    
    # 定义一个被装饰的函数
    
    def f1():
    
        print("Hello World.")
    
    # 用foo函数装饰f1函数
    
    f1 = foo(f1)
    
    # 不改变f1的调用方式
    
    f1()  # --> 此时函数已经扩展了新功能
    
    

    五 装饰器形态2

    
    # 还是定义一个外层函数
    
    def foo(name):  # 接收的参数是一个函数名
    
        # 定义了一个内部函数
    
        def bar():
    
            print("这是新功能。。。")  # 新功能
    
            name()  # 函数名加()就相当于执行 --> 传进来原函数的函数名,这里就相当于执行了原函数
    
        return bar
    
    # 定义一个被装饰的函数
    
    # 用foo函数装饰f1函数
    
    @foo # 使用f1 = foo(f1)语法装饰的话稍显啰嗦,Python就提供了@语法,让装饰过程更简便
    
    def f1():
    
        print("Hello world.")
    
    # 不改变f1的调用方式
    
    f1()  # --> 此时函数已经扩展了新功能
    
    

    相关文章

      网友评论

          本文标题:装饰器五部曲

          本文链接:https://www.haomeiwen.com/subject/jecapftx.html