装饰器

import functools


def func(text):
    if isinstance(text, str):  # 判断是否带参数
        def decorator(log):
            @functools.wraps(log)  # 给wrapper函数继承被装饰的函数的__name__属性
            def wrapper(*args, **kwargs):
                print('%s %s():' % (text, log.__name__))
                print('begin call')
                log(*args, **kwargs)
                print('end call')

            return wrapper

        return decorator
    else:
        @functools.wraps(text)
        def wrapper(*args, **kwargs):
            print('execute1 %s():' % (text.__name__))
            print('begin call')
            text(*args, **kwargs)
            print('end call')

        return wrapper


@func('execute1')  # 这一步的过程:now1 = func('execute1')(now1) = decorator(now1) = wrapper
def now1():
    print('2020')


@func
def now2():
    print('2020')


now1()
now2()

# 写一个可用于任何函数的装饰器,可用于计算该函数执行所用时间
# -*- coding: utf-8 -*-
import time, functools


def metric(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kwargs):
        start = time.time()
        x = fn(*args, **kwargs)
        end = time.time()
        print('%s executed in %s ms' % (fn.__name__, end - start))
        return x

    return wrapper


# 测试
@metric
def fast(x, y):
    time.sleep(0.0012)
    return x + y;


@metric
def slow(x, y, z):
    time.sleep(0.1234)
    return x * y * z;


f = fast(11, 22)
s = slow(11, 22, 33)
if f != 33:
    print('测试失败!')
elif s != 7986:
    print('测试失败!')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值