装饰器的理解

装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中必问的问题,但对于好多初次接触这个知识的人来讲,这个功能有点绕,自学时直接绕过去,然后面试到就持了,因为装饰器是程序开发的基础知识,这个都不会,别跟人家说你会Python,看了下面的文章保证你学会装饰器

1、先看明白下面这段代码

# 第一段
# def foo():
#     print("foo")
#
# foo
# foo()

# 第二段
def foo():
    print("foo")
foo = lambda x: print(x+1)

foo(2) # 执行lanbda表达式,而不再是原来的函数,因为foo这个名字被重新指向了另外一个匿名函数

 

函数名仅仅是个变量,只不过指向了定义的函数而忆,所以才能通过函数名()调用,如何函数名=xxx,被修改了,那么当在执行函数名()时,调用的就不是之前的那个函数了

第二段程序:

"""装饰器的例子"""

def set_func(func):
    def call_func():
        print("----------这是权限验证1----------")
        print("----------这是权限验证2----------")
        print("----------这是权限验证3----------")
        func()
    return call_func

@set_func
def test1():
    print("-------test-----")

test1()

这段代码就是使用了装饰器

以上这段码的结果会执行call_func函数,再执行test1函数

结果为:

----------这是权限验证1----------
----------这是权限验证2----------
----------这是权限验证3----------
-------test-----

 

那以下第三段代码用来说明装饰器的使用:

"""装饰器的实现"""

def set_func(func):
    def call_func():
        print("----------这是权限验证1----------")
        print("----------这是权限验证2----------")
        print("----------这是权限验证3----------")
        func() # 执行func函数,因为func变量指向函数test1,故相当于执行test1函数
    return call_func

# @set_func
def test1():
    print("-------test-----")

# ret = set_func(test1)
# ret()

""" 
    定义了变量test1,等于set_func的返回值,即指向set_func的内部函数call_func函数,而实参里面的test1开始是指向test1函数的
    在set_func函数内部,call_func函数的引用返回给变量test1,这时候test1变量是指向函数call_func
    而set_func的实参就是函数test1的引用,func变量就指向了test1函数,func()相当于执行test1函数
    
"""
test1= set_func(test1)
test1()

从而得到以下结论:

@set_func 等价于:test1= set_func(test1)

装饰器就是将一个函数的引用当作实参传递到另外一个闭包里面去,然后这个闭包里面会调用这个函数的引用,表现形式就是在原来调用函数不变的情况下,能做到对原函数功能的扩展

 

posted @ 2020-04-14 16:21  aaron616  阅读(142)  评论(0编辑  收藏  举报