python装饰器

目录

1.闭包:

2.装饰器:

在不改变函数的情况下增强print的功能

能传参的装饰器:

给装饰器传参

# 计算睡眠时间


1.闭包:

1.闭包:
  嵌套函数
 闭包(closure)是一个函数以及其捆绑的周边环境状态( lexical environment , 词法环境 )的引用的组合, 闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量, 所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。 (内层函数引用外层函数的的变量(捆绑环境),内层函数作为返回值返回给外层函数)
例:嵌套函数
data = "global"
def outer():
    data = "outer"
    print(data)
    def inter():
        data = "inter"
        print(data)
    return inter

inter = outer()        # outer        只会执行打印outer并且返回inter
inter()                # inter        若没有inter = outer()则无法调用inter
print(data)            # global        此时data对应的global为全局变量
定义一个嵌套函数求平均值
def outer_avg():
    sum_list = []
    def avg(num):
        sum_list.append(num)
        print(sum(sum_list) / len(sum_list))
    return avg

avg = outer_avg()
avg(10)        # 10.0
avg(11)        # 10.5
avg(12)        # 11.0

2.装饰器:

语法糖:@装饰器
装饰器功能:在不改变原函数的情况下,增强原函数的功能
如何去定义一个装饰器
1.装饰器是一个闭包(嵌套函数)
2.既然是一个嵌套函数,那么他会有:外层函数,内层函数。而且内层函数引用外层函数的变量(原函数)
3.将原函数作为参数传递给外层函数, 内层函数引用外层函数传递的原函数参数
4.外层函数的返回值是内层函数

在不改变函数的情况下增强print的功能

# 不使用装饰器
def print_hello():
    print("Hello")
def decorator(func):
    def inner():
        print("start")
        func()
        print("end")
    return inner
inner = decorator(print_hello)
inner()
'''
start
Hello
end
'''
# 使用装饰器
def decorator(func):
    def inner():
        print("start")
        func()
        print("end")
    return inner

@decorator
def print_hello():
    print("Hello")

print_hello()
'''
start
Hello
end
'''

能传参的装饰器:

def decorator(func):
    def inner(arg1, arg2):
        print("start")
        func(arg1, arg2)
        print("end")
    return inner

@decorator
def print_hello(arg1, arg2):
    print(arg1, arg2)

print_hello(1, 2)

给装饰器传参

使用装饰器

def decorator(arg):
    def outer(func):
        def inner(arg1, arg2):
            print(arg, "start")
            func(arg1, arg2)
            print(arg, "stop")
        return inner
    return outer

@decorator("debug")
def print_arg(arg1, arg2):
    print(arg1, arg2)


print_arg(1, 2)
不使用装饰器
def decorator(arg):
    def outer(func):
        def inner(arg1, arg2):
            print(arg, "start")
            func(arg1, arg2)
            print(arg, "stop")
        return inner
    return outer


def print_arg(arg1, arg2):
    print(arg1, arg2)
    
outer = decorator("debug")
inner = outer(print_arg)
inner(1, 2)

# 计算睡眠时间

import time
before_time = time.time()
time.sleep(5)
print("after sleep")
after_time = time.time()
run_time = before_time - after_time
print(run_time)
程序睡眠/秒
import time
time.sleep(秒数)
print("after sleep")
import time
time.sleep(5)
print("after sleep")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱玩网络的小石

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

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

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

打赏作者

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

抵扣说明:

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

余额充值