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

    装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是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)

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

    **************只要学不死就往死里学!************
  • 相关阅读:
    media Queries实现一个响应式的菜单
    跨域资源共享(CORS)在ASP.NET Web API中是如何实现的?
    Media Formatters媒体格式化器
    Winform系列
    node-webkit入门
    WCF 自承载
    HttpClient的使用-爬虫学习1
    为什么程序员的工作效率跟他们的工资不成比例(转)
    大师们都是怎么撑场面的(转)
    马云关于企业发展的一些看法
  • 原文地址:https://www.cnblogs.com/lxhaaron/p/12676255.html
Copyright © 2011-2022 走看看