Python:闭包装饰器简介和基本使用

01_函数参数

def func01():
    print("func01 is show")

# func01()
# 函数名存放的是函数所在空间的地址
# print(func01)
# 函数名也可以像普通变量一样赋值
# func02 = func01
# func02()

def foo(func):
    func()
    
foo(func01)

02_闭包

# 闭包的构成条件:
# 1在函数嵌套(函数里面再定义函数)的前提下
def func_out(num1):
    def func_inner(num2):
# 2内部函数使用了外部函数的变量(还包括外部函数的参数)
        num = num1 + num2
        print("现在的值:", num)
# 3外部函数返回了内部函数
    return func_inner


# 创建闭包实例
f = func_out(10)
# 执行闭包
f(1)
f(2)

 

03_闭包的使用

# 外部函数
def config_name(name):
    # 内部函数
    def say_info(info):
        print(name + ":", info)

    return say_info

tom = config_name("tom")
tom("你好")
tom("你在么")

jerry = config_name("jerry")
jerry("你好")
jerry("我在呢")


04_nonloal的使用

# 外部函数
def func_out(num1):
    # 内部函数
    def func_inner(num2):
        nonlocal num1
        num1 = num2 + 10

    print(num1)
    func_inner(10)
    print(num1)

    return func_inner

# num1 = 10
# f = func_out(10)
# 调用闭包 = 内部函数 num2 = 10
# f(10)

func_out(10)

05_装饰器

# 1定义一个装饰器(装饰器的本质是闭包)
def check(fn):
    def inner():
        print("登陆验证。。。")
        fn()

    return inner

# 需要被装饰的函数
def comment():
    print("发表评论")

# 2使用装饰器装饰函数(增加一个登陆功能)
comment = check(comment)
comment()




06_装饰器语法糖

# 1定义一个装饰器(装饰器的本质是闭包)
def check(fn):
    def inner():
        print("请先登陆")
        fn()

    return inner


# 2使用装饰器装饰函数(增加一个登陆功能)
# 解释器遇到@check 会立即执行 comment = check(comment)
@check
def comment():
    print("发表评论")

comment()


07_装饰器的使用

import time

# 1 定义装饰器
def get_time(fn):
    def inner():
        start = time.time()
        fn()
        end = time.time()

        print("时间:", end - start)

    return inner

# 2 装饰函数
# 要被装饰的函数
@get_time
def func():
    for i in range(100000):
        print(i)

func()


08_装饰有参数的函数

# 定义装饰器
def logging(fn):  # fn = sum_num
    def inner(a, b):
        fn(a, b)

    return inner  # sum_num = inner

# 使用装饰器装饰函数
@logging
def sum_num(a, b):
    result = a + b
    print(result)


sum_num(1, 2)

09_装饰带有返回值的函数

# 定义装饰器
def logging(fn):  # fn = sum_num
    def inner(a, b):
        result = fn(a, b)
        return result

    return inner  # sum_num = inner

# 使用装饰器装饰函数
@logging
def sum_num(a, b):
    result = a + b
    return result


result = sum_num(1, 2)
print(result)

10_装饰带有不定长参数的函数

# 定义装饰器
def logging(fn):  # fn = sum_num
    def inner(*args, **kwargs):
        fn(*args, **kwargs)

    return inner  # sum_num = inner

# 使用装饰器装饰函数
@logging
def sum_num(*args, **kwargs):
    print(args, kwargs)


sum_num(1, 2, 3, age="18")

11_通用装饰器

# 定义装饰器
def logging(fn):  # fn = sum_num
    def inner(*args, **kwargs):
        result = fn(*args, **kwargs)
        return result

    return inner  # sum_num = inner

# 使用装饰器装饰函数
@logging
def sum_num(*args, **kwargs):
    print(args, kwargs)


sum_num(1, 2, 3, age="18")

12_多个装饰器的使用

# 定义装饰器1
def check1(fn1):
    def inner1():
        print("登陆验证1")
        fn1()

    return inner1


# 定义装饰器2
def check2(fn2):
    def inner2():
        print("登陆验证2")
        fn2()

    return inner2

# 被装饰器的函数

@check1
@check2
def comment():
    print("发表评论")


comment()



13_带参数的装饰器_错误演示

# 装饰器
# 外部函数
def decorator(fn, flag):
    # 内部函数
    def inner(num1, num2):
        # 判断流程
        if flag == "+":
            print("--正在努力加法计算--")
        elif flag == "-":
            print("--正在努力减法计算--")
        result = fn(num1, num2)
        return result

    return inner


# 被带有参数的装饰器装饰的函数
@decorator('+')
def add(a, b):
    result = a + b
    return result


# 执行函数
result = add(1, 3)
print(result)

14_带参数的装饰器_正确用法

# 装饰器
def logging(flag):  # flag = "+"


    # 外部函数
    def decorator(fn):
        # 内部函数
        def inner(num1, num2):
            # 判断流程
            if flag == "+":
                print("--正在努力加法计算--")
            elif flag == "-":
                print("--正在努力减法计算--")
            result = fn(num1, num2)
            return result

        return inner


    # 返回装饰器
    return decorator


# 被带有参数的装饰器装饰的函数
@logging('+')  # 1 logging("+") 2 @decorator起到装饰器的功能了
def add(a, b):
    result = a + b
    return result


# 执行函数
result = add(1, 3)
print(result)

15_类中call方法的使用

# 定义一个类,实现__call__方法
class Check(object):
    def __call__(self, *args, **kwargs):
        print("我是call方法")

c = Check()
c()

16_类装饰器

# 定义类装饰器
class Check(object):
    def __init__(self, fn):  # fn = comment
        self.__fn = fn

    def __call__(self, *args, **kwargs):
        print("登陆")
        self.__fn()  # comment()


# 被装饰的函数
@Check  # comment = Check(comment)
def comment():
    print("发表评论")


comment()
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员无羡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值