zoukankan      html  css  js  c++  java
  • 028 闭包/装饰器

    /*
    时间:2021/12/18
    功能:闭包/装饰器
    目录: 
        一: 闭包
            1 定义
            2 简单
            3 应用
            4 调用外部变量
        二: 装饰器
            1 定义
            2 完全写法
            3 简略写法
            4 应用 : 计算时间
            5 通用装饰器
            6 嵌套装饰器
            7 参数装饰器
            8 类装饰器
    */

    一: 闭包
      1 定义

    /*
    定义:
        1 函数嵌套
        2 内函数使用外函数参数或变量
        3 外部函数返回内部函数
    */

      2 简单

    def func_out():
        num1 = 10
        def func_inner123(num2):
            result = num1 + num2
            print("result: ", result)
        return  func_inner123
    
    if __name__ == '__main__':
        new_func = func_out()
        new_func(1)
        new_func(10)

      3 应用

    def config_name(name):
        def inner(msg):
            print(name + ":" + msg)
        print(id(inner))    # 地址不同
        return inner
    
    if __name__ == '__main__':
        # 创建对象 : 闭包实例
        tom = config_name("tom")
        jerry = config_name("jerry")
    
        tom("hi")
        jerry("hello")
        tom("Nice to meet you")
        jerry("Nice to meet you to")

      4 调用外部变量

    def func_out():
        num1 = 10
        def func_inner():
            nonlocal num1   # 声明: 外部变量
            num1 = 0
    
        print(num1)
        func_inner()
        print(num1)
        return  func_inner
    
    if __name__ == '__main__':
        # 创建对象 : 闭包实例
        f1 = func_out()
        f1()


    二: 装饰器
      1 定义

    /*
    定义:
        1 不修改已有函数的源代码
        2 不修改已有函数的调用方式
        3 给以后函数添加额外的功能
        4 如果闭包函数的参数有且只有一个并且是函数类型,那么这个闭包函数称为装饰器
    */

      2 完全写法

    # 完全写法
    def decorator(func):
        print("装饰器: ")
        def inner():
            print("已添加登录验证")
            func()
        return  inner
    
    def comment():
        print("发表评论")
    
    
    if __name__ == '__main__':
        comment = decorator(comment)
        comment()

      3 简略写法

    # 简略写法   
    def decorator(func):
        print("装饰器: ")
        def inner():
            print("已添加登录验证")
            func()
        return  inner
    
    # 装饰器语法糖写法 : @装饰器名称
    @decorator  # 代码封装 : comment = decorator(comment)  comment=inner
    def comment():
        print("发表评论")
    
    
    if __name__ == '__main__':
        # comment = decorator(comment) comment=inner
        comment()

      4 应用 : 计算时间

    # 计算时间
    import time
    
    def decorator(func):
        def inner():
            begin = time.time()
            func()
            end = time.time()
    
            result = end - begin
            print("执行时间: ", result)
        return  inner
    
    @decorator
    def work():
        for i in range(10000):
            print(i)
    
    if __name__ == '__main__':
        work()

      5 通用装饰器

    #######################################     
    # 参数
    def decorator(func):
        def inner(a, b):
            func(a, b)
        return  inner
    
    @decorator
    def add_num(num1, num2):
        result = num1 + num2
        print("result: ", result)
    
    
    if __name__ == '__main__':
        add_num(1, 2)    
           
    #######################################   
    # 返回值    
    def decorator(func):
        def inner(a, b):
            result = func(a, b)
            return result
        return  inner
    
    @decorator
    def add_num(num1, num2):
        result = num1 + num2
        return result
    
    
    if __name__ == '__main__':
        result = add_num(1, 2)
        print(result)    
         
    #######################################     
    # 通用装饰器
    def decorator(func):
        def inner(*args, **kwargs):
            result = func(*args, **kwargs)
            return result
        return  inner
    
    @decorator
    def sum_num(*args, **kwargs):
        result = 0
        for value in args:
            result += value
    
        for value  in kwargs.values():
            result += value
    
        return result
    
    @decorator
    def show():
        return "尽快了解了"
      
      
    if __name__ == '__main__':
        sum_num(1, 2, a=10)
        
        result = show()
        print(result)   
    #######################################


      6 嵌套装饰器

    # 嵌套饰器
    def make_div(func):
        print("make_div start")
        def inner():
            result = "<div>" + func() + "</div>"
            return result
        return inner
    
    def make_p(func):
        print("make_p start")
        def inner():
            result = "<p>" + func() + "</p>"
            return result
        return inner
    
    @make_div   # 原理剖析: content = make_div(make_p(content))
    @make_p
    def content():
        return "人生苦短,快用python"
    
    if __name__ == '__main__':
        result = content()
        print(result)

      7 参数装饰器

    # 参数装饰器
    def return_decorator(flag):
        def decorator(func):
            def inner(a, b):
                if flag == "+":
                    print("加法计算")
                elif flag == "-":
                    print("减法计算")
                func(a, b)
            return inner
        return decorator    # 调用该函数: 返回装饰器
    
    @return_decorator("+")
    def add_num(a, b):
        result = a + b
        print(result)
    
    @return_decorator("-")
    def sub_num(a, b):
        result = a - b
        print(result)
    
    if __name__ == '__main__':
        add_num(1, 2)
        sub_num(7, 2)

      8 类装饰器

    # 类装饰器
    class my_decorator(object):
        def __init__(self, func):
            self.__func = func # 初始化
    
        # __call__方法: ,让对象变成可调用的对象,可调用的对象能够像函数使用
        def __call__(self, *args, **kwargs):
            print("over")
            self.__func()
    
    
    @my_decorator   # 等价于 : show=my_decorator(show); init方法
    def show():
        print("show()")
    
    if __name__ == '__main__':
        show()
  • 相关阅读:
    从头到尾彻底理解KMP
    [CF1220E] Tourism
    [CF446C] DZY Loves Fibonacci Numbers
    [CF1003E] Tree Constructing
    [CF1238E] Keyboard Purchase
    [CF915E] Physical Education Lessons
    [CF788B] Weird journey
    [CF1371E2] Asterism (Hard Version)
    [CF780E] Underground Lab
    [CF372C] Watching Fireworks is Fun
  • 原文地址:https://www.cnblogs.com/huafan/p/15706290.html
Copyright © 2011-2022 走看看