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

    装饰器

    主要内容:
      1.函数名的运用,第一类对象

      2.闭包

      3.装饰器

      4.通用装饰器的回顾

      5.函数的有用信息

      6.带参数的装饰器

      7.多个装饰器同时装饰一个函数

    一.函数名的运用

    函数名是一个变量,但是一个特殊的变量,与括号配合可以执行函数的变量

      1.函数的内存地址

    def fun():
        print('呵呵')
    print(fun) # 返回这个函数的内存地址

      2.函数名可以赋值给其他的变量

    def fun():
        print('呵呵')
    print(fun)
    a = fun
    a()

      3.函数名可以当作容器类元素

    复制代码
    def func1():
        print('呵呵')
    def func2():
        print('哈哈')
    def func3():
        print('拉拉')
    def func4():
        print('可可')
    def func5():
        print('哦哦')
    lst = [func1,func2,func3,func4,func5]
    for i in lst:
        i()
    复制代码

      4.函数名可当做函数的参数

    复制代码
    def func():
        print('吃了么')
    def func2(fn):
        print('我是func2')
        fn()
        print('我是func2')
    func2(func)
    复制代码

      5.函数名可以作为函数的返回值

    复制代码
    def func_1():
        print('这里是函数1')
        def func_2():
            print('这是函数2')
        print('这是函数1')
        return func_2
    fn = func_1()
    fn()
    复制代码

    二.闭包

      什么是闭包?闭包就好是内层函数,对外层函数(非全局)的变量的引用,叫闭包

    def func1():
        name = 'alex'
        def func2():
            print(name)
        func2()
    func1()

      我们可以用_closure_来检测函数是否是闭包,如果是闭包就返回:cell,不是闭包就返回None

    复制代码
    def func1():
        name = 'alex'
        def func2():
            print(name)
        func2()
        print(func2.__closure__)
    func1()
    复制代码

      如何在函数外边调用内部函数

    复制代码
    def outer():
        name= "alex"
        def inner():
            print(name)
        return inner
    fn = outer()
    fn() # 访问内部函数
    复制代码

      多层嵌套如何办

    复制代码
    def func1():
        name = 'alex'
        def func2():
            def func3():
                def func4():
                    print(name)
                return func4
            return func3
        return func2
    func1()()()()
    复制代码

      闭包的作用就是一个变量能够常驻内存,供后面的程序使用

    三.装饰器初始

      软件设计的原则:开闭原则,又被称为开放封闭原则,你的代码对功能的扩展是开放的,你的程序对修改源代码是封闭的,这样的软件设计思路可以更好的维护和开发

      开放:对功能扩展开放

      封闭:对修改代码封闭

    复制代码
    def create_people():
        print('女娲很厉害,还会捏人呢')
    def warter(fn):
        def inner():
            print('先取水')
            fn()
            print('最后在上烤炉')
        return inner
    create_people= warter(create_people)
    create_people() # 这个create_people其实相当于inner
    复制代码

      我们使用warter函数把create_people给包装一下,在不修改create_people的前提下,完成了对create_people的函数的功能添加

      语法糖:@装饰器

      1.最基本的

    复制代码
    def wen_jin(fn):
        def inner():
            print('执行函数之前')
            fn()
            print('执行之后')
        return inner
    @wen_jin # 这个就相当于yue = wen_jin(yue) #也就是个inner
    def yue():
        print('大家好')
    yue()
    复制代码

      2.中级

    复制代码
    # 最基本的参数传递
    def wen_jin(fn):
        def inner(name):
            print('函数执行之前')
            fn(name)
            print('函数执行之后')
        return inner
    @wen_jin
    def yue(name):
        print('呵呵了',name)
    yue('熬啊')
    复制代码

     

      3.最终(也是最基本的装饰器格式)

    复制代码
    # 带参数了,还需要返回值
    def wrapper(func):
        def inner(*args,**kwargs):#聚参
            print('函数之前要执行的内容')
            ret = func(*args,*kwargs) # 解参
            print('函数之后要执行的内容')
            return ret    #返回这个函数的返回值
        return inner
    @wrapper
    def target_func(a,b,c,d):
        print('函数执行中%s'%a,b,c,d)
        return
    
    target_func(1,3,6,2)
    复制代码

    4.函数的有用信息
       1.给函数添加注释
       在函数的第一行加上3个三引号
       2.如何获取函数的相关信息
       函数名.__name__可以查看函数的名字
       函数名.__doc__可以查看函数文档的注释
      

    5.修改函数的名称
       from functools import wraps 引入模块
       @wraps(函数名)
       def inner()
      

    6.装饰器传参
      就是在最外层加一层,里面可以添加一个变量
      

    7.多个装饰器装饰同一个函数
      顺序是:321函数123        {   [   ( 函数 )   ]   }

  • 相关阅读:
    蓝奏云的链接打不开
    数据链路层
    markdown(md)
    物理层
    计算机网络概述
    86五笔学习笔记
    Ubuntu初次使用的问题
    Hello Word!
    快速创建Flask Restful API项目
    Ubuntu环境下部署Django+uwsgi+nginx总结
  • 原文地址:https://www.cnblogs.com/123zzy/p/9185138.html
Copyright © 2011-2022 走看看