装饰器初阶

  • 函数名的运用
    • 函数名是一个变量,但他是一个特殊的变量,与括号配合可以执行函数的变量
      • 函数名的内存地址
      • def func():
            print("呵呵")
        print(func)
        # 结果: <function func at 0x1101e4ea0>
      • 函数名可以复制给其他变量
      • 函数名可以当做容器类的元素
      • 函数名当做函数的参数
      • 函数名可以当做函数的返回值
  • 闭包
    • 闭包就是内层函数,对外层函数(非全局)的变量的引用,叫闭包
    • 我们可以使用_closure_来检测函数是否闭包.使用函数名._closure_返回cell就是闭包,返回None就不是闭包.
    • 在函数外部访问内部函数,可让函数将内部函数名作为返回值返回.多层嵌套只要一层一层往外层返回就可以了.
    • 闭包的好处:
      • 我们可以在外界访问内部函数,但访问的时间和时机不一定.如果一个函数执行完毕,则这个函数中的变量以及局部命名空间中的内容将会被销毁,在闭包中如果变量销毁了,则内部函数将不能正常运行,所以python规定,如果你在内层函数访问了外层函数中的变量,那么这个变量将不会消亡,将会常驻在内存中.
      • 所以使用闭包,可以保证外层函数中的变量将会在内存中常驻
      • 一下是一个爬虫的代码,看看这样的好处
      • from urllib.request import urlopen
        def but():
            content = urlopen("http://www.xiaohua100.cn/index.html").read()
            def get_content():
                return content
            return get_content
        fn = but()
        # 这个时候就开始加载校花100的内容
        #  后⾯需要用到这里面的内容就不需要在执行非常耗时的网络连接操作了
        content = fn()  # 获取内容
        print(content)
        content2 = fn()  # 重新获取内容
        print(content2)
      • 总之闭包的作用就是让一个常量常驻内存,供后面的程序使用
  • 装饰器初识
    • 软件设计的开闭原则
      • 你的代码对功能的扩展是开放的,对修改源代码是封闭的.这样的设计思路可以更好的维护和开发
    • 装饰器的目的是为了既不修改源代码,又能添加新功能
    • 用其他函数对原函数包装了一下,在不修改原函数的情况下,完成功能的添加,就是装饰器
    • 语法糖 @其他函数 意味着 原函数=其他函数(原函数)
    • 装饰器的完整代码
    • def deco(func):
          def inner(*args,**kwargs):
              print("每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码")
              ret=func(*args,**kwargs)
              print("每次执行被装饰函数之后都得先经过这里,这里根据需求添加代码")
              return ret
          return inner
      @deco
      def func1():
          print("运行该函数")
      func1()

猜你喜欢

转载自www.cnblogs.com/zxmbky/p/9185018.html