python装饰器的定义和使用

装饰器:通过@Decorator_name来装饰某个函数,执行该函数的时候会对该函数进行的对应的修饰。

装饰器的写法与闭包类似:内部函数要返回给外部函数,但是不同的是,装饰器内部函数调用的是函数,闭包是变量。

通过以下例子来帮助理解吧~

例子需求:执行a函数运行的时长等信息

未使用装饰器前:

import time
def i_can_sleep():
	time.sleep(3)

start_time = time.time() # 开始执行的时间
stop_time = time.time() # 结束的时间
i_can_sleep()
print("运行了 %s 秒" %(stop.time - start.time))

以上的实现还是比较繁琐的,如果其它函数也有同样的修饰需求,那可能增加很多重复的代码,复用性不高。以下是使用装饰器的情况。

import time

def timmer():
	def wrapper():
		start_time = time.time()
		func()
		stop_time = time.time()
		print("运行了 %s 秒" %(stop.time - start.time))

# 使用装饰器
@timmer
def i_can_sleep():
	time.sleep(3)

i_can_sleep()

以上,使用@timmer装饰器之后运行i_can_sleep()会把该函数传入装饰器,对该函数进行修饰,执行的过程如下

num = timmer(i_can_sleep()) # 把i_can_sleep()传入ti mmer(),创建一个对象num
num()  # 执行函数

带参数的装饰器?

为了装饰器的复用性以及能满足需求,装饰器需要根据情况带参数

装饰器内部函数带参数
def tips(func):
    # 内部函数带参
    def nei(a,b):
        print('start')
        func(a,b)
        print('stop')
    return nei

@tips
def add(a,b):
    print(a+b)

@tips
def sub(a,b):
    print(a-b)


print(add(4,5))
print(sub(10,4))


执行结果如下:
start
9
stop
None
start
6
stop
None
装饰器带参数

# 装饰器外部带一个参数argv
def new_tips(argv):
    def tips(func):
        # 内部函数带参
        def nei(a, b):
        # 根据需要可以打印执行函数的函数名,通过func.__name__获取
            print('start run %s ,函数名是%s ' %(argv,func.__name__))
            func(a, b)
            print('stop')

        return nei
    return tips

@new_tips('add_numbers')
def add(a,b):
    print(a+b)

@new_tips('sub_numbers')
def sub(a,b):
    print(a-b)


print(add(4,5))
print(sub(10,4))

执行结果如下:
start run add_numbers ,函数名是add 
9
stop
None
start run sub_numbers ,函数名是sub 
6
stop
None

装饰器的特点

  1. 调用函数不用重复编写的修饰代码
  2. 装饰器代码需要复用可加上参数
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值