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()
原文地址:https://www.cnblogs.com/huafan/p/15706290.html