python 装饰器

装饰器的理解

装饰器:本质就是函数,用于装饰其他函数, 附加所装饰函数所没有的功能。

首先先理解下闭包:

# 闭包
def say_name(name):
    def hello():
        print(name)
    return hello  # 返回hello函数的内存地址
#闭包调用
sn = say_name('王')
sn()

装饰器解决的需求:现在有下面一个函数,想算一下函数运行的时间,但是不能改变原来的函数的原来代码和调用方式,应该怎么解决呢

import time
def eat():
    print('吃。。。')
    time.sleep(3)

eat()

原生装饰器:

import time

#装饰器函数
def count_time(func):
    def wrapper():
        start_time = time.time()
        func()
        end_time = time.time()
        print('共花费时间:', end_time - start_time)
    return wrapper

def eat():
    print('吃。。。')
    time.sleep(3)

eat = count_time(eat)
eat()

不带参数的被装饰的函数

import time

def count_time(func):
    def wrapper():
        start_time = time.time()
        func()
        end_time = time.time()
        print('共花费时间:', end_time - start_time)
    return wrapper

@count_time  # 相当于eat = count_time(eat)
def eat():
    print('吃。。。')
    time.sleep(3)

eat()

带参数的被装饰的函数

def count_time(func):
    def wrapper(food):
        start_time = time.time()
        func(food)
        end_time = time.time()
        print('共花费时间:', end_time - start_time)
    return wrapper

@count_time#相当于eat = count_time(eat)
def eat(food):
    print('吃%s....' % food)
    time.sleep(3)

eat('苹果')

带参数的装饰器

import time

def write_log(flog=0):
    def count_time(func):
        def wrapper(food):
            start_time = time.time()
            func(food)
            end_time = time.time()
            print('共花费时间:', end_time - start_time)
            if flog == 1:
                print('该数据写入了日志')
        return wrapper
    return count_time

@write_log(1)  #相当于eat=write_log(1)(eat)
def eat(food):
    print('吃%s....' % food)
    time.sleep(3)
    
eat('苹果')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值