python装饰器(超详实例)

例1:普通装饰器

def timer(func):
    def wrapper():
        start = time.time()
        func()
        end = time.time()
        print(end-start)
        # 保留四位有效数字
        print('total time:{:.4}'.format(end-start))
    return wrapper

@timer
def step1():
    count = 0
    for i in range(1000000):
        count+=1

@timer
def step2():
    count = 0
    for i in range(12000000):
        count+=1
        
# step1()
# step2()

例2:函数带参数

def timer2(func):
    def wrapper(*args):
        start = time.time()
        func(*args)
        end = time.time()
        print(end-start)
        # 保留四位有效数字
        print('total time:{:.4}'.format(end-start))
    return wrapper


@timer2
def step11(num):
    count = 0
    for i in range(num):
        count+=1

@timer2
def step21(num):
    count = 0
    for i in range(num):
        count+=1
        
# step11(10000000)
# step21(1200000)

例3:带返回值

def timer3(func):
    def wrapper(*args):
        start = time.time()
        value = func(*args)
        end = time.time()
        print(end-start)
        # 保留四位有效数字
        print('total time:{:.4}'.format(end-start))
        return value
    return wrapper

@timer3
def step13(num):
    count = 0
    for i in range(num):
        count+=1
    return count

@timer3
def step23(num):
    count = 0
    for i in range(num):
        count+=1
    return count    
                
                
# step13(10000000)
# step23(1200000)

例4:打印日志(实际应用)

# 打印日志,生产中用 的最多
def debug(func):
    def wrapper(*args, **kwargs):
        print(f'{func.__name__}:{args},{kwargs}')
        ret_val = func(*args, **kwargs)
        print(f'return :{ret_val}')
        return ret_val
    return wrapper

@debug
def add(a,b):
    return a+b

# add(2,5)

例5:让函数变慢()

# 让函数运行变慢
def slow(func):
    def wrapper(*args, **kwargs):
        time.sleep(1)
        ret_value = func(*args, **kwargs)
        return ret_value
    return wrapper

@slow
def add2(a, b):
    return a+b

# add2(2,5)

例6:装饰器带参数

要在普通装饰器外面在套上一层

# 装饰器参数
# 要在普通装饰器外面在套上一层

def slow2(seconds):
    def decorator_slow(func):
        def wrapper(*args, **kwargs):
            print(f'sleep:{seconds} seconds')
            time.sleep(seconds)
            ret_value = func(*args, **kwargs)
            return ret_value
        return wrapper
    return decorator_slow

@slow2(1)
def add3(a,b):
    return a+b

# add3(2,6)

例7: 类装饰器,单例模式

# 类装饰器,单例模式
def single(cls):
    def single_wrapper(*args, **kwargs):
        if not single_wrapper.instance:
            single_wrapper.instance = cls(*args, **kwargs)
            return single_wrapper.instance
    single_wrapper.instance = None
    return single_wrapper

class V():
    def __init__(self) -> None:
        self.count = 0
    def v(self):
        self.count+=1
        print(f'the {self.count} times visit')
        
c = V()
c.v()
c.v()

例8:带状态的装饰器,

记录第几次调用

# 带状态的装饰器,装饰器记录第几次调用
def count(func):
    def wrapper(*args, **kwargs):
        wrapper.count+=1
        print(f'第{wrapper.count}次调用')
        func()
    wrapper.count = 0
    return wrapper

@count
def run():
    pass
run()
run()
  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值