【每天1分钟】PYTHON基础之函数(装饰器)

【每天1分钟】PYTHON基础之函数(装饰器)

1. 定义

装饰器也是一个函数,它是让其他函数在不改变变动的前提下增加额外的功能。
装饰器是一个闭包,把一个函数当作参数返回一个替代版的函数,本质是一个返回函数的函数(即返回值为函数对象)。
python3支持用@符号直接将装饰器应用到函数。
装饰器工作场景:插入日志、性能测试、事务处理等等。
函数被装饰器装饰过后,此函数的属性均已发生变化,如名称变为装饰器的名称。


2. 装饰器

2.1 被装饰的函数不带参数

>>> def my_decorator(func):
	def inner():
		print("**********")
		print("要添加的功能代码")
		func()
	return inner

>>> def script1():
	print("测试")

	
>>> script1()
测试
>>> runScript1 = my_decorator(script1)
>>> runScript1()
**********
要添加的功能代码
测试
>>> @my_decorator
def script1():
	print("测试")

	
>>> script1()
**********
要添加的功能代码
测试
>>> 

2.2 被装饰的函数带参数

可变参数args和关键字参数*kwargs添加函数通用的装饰器

>>> def my_decorator(func):
	def inner(*args, **kwargs):     # 可变参数*args和关键字参数**kwargs
		print("**********")
		print("要添加的功能代码")
		func(*args, **kwargs)
	return inner

>>> 
>>> def script2(arg):
	print("测试:%s" % arg)

	
>>> script2('abcde')
测试:abcde
>>> 
>>> runScript2 = my_decorator(script2)
>>> runScript2("abcde")
**********
要添加的功能代码
测试:abcde
>>> 
>>> @my_decorator
def script2(arg):
	print("测试:%s" % arg)

	
>>> script2('abcde')
**********
要添加的功能代码
测试:abcde
>>>

2.3 装饰器带参数

>>> def my_decorator(name):
	def outer(func):
		def inner(*args, **kwargs):
			print("********")
			print("添加带装饰器参数%s的功能代码" % (name))
			func(*args, **kwargs)
		return inner
	return outer

>>> def script3(arg):
	print("测试----%s" % arg)

	
>>> script3("bbb")
测试----bbb

>>> runScript3 = my_decorator(name='settings')
>>> runScript3_1 = runScript3(script3)
>>> runScript3_1("bbb")
********
添加带装饰器参数settings的功能代码
测试----bbb

>>> runScript4 = my_decorator(name='settings')(script3)
>>> runScript4("bbb")
********
添加带装饰器参数settings的功能代码
测试----bbb
>>> 

>>> @my_decorator(name='settings')
def script3(arg):
	print("测试----%s" % arg)

	
>>> script3("bbb")
********
添加带装饰器参数settings的功能代码
测试----bbb
>>> 

2.4 多个装饰器的执行顺序

>>> def my_decorator_1(func):
	def inner():
		print('1111111111111111111')
		print('我是:my_decorator_1,')
		func()
	return inner

>>> def my_decorator_2(func):
	def inner():
		print('2222222222222222222')
		print('我是:my_decorator_2,')
		func()
	return inner

>>> def my_decorator_3(func):
	def inner():
		print('3333333333333333333')
		print('我是:my_decorator_3,')
		func()
	return inner

>>> def script4():
	print('从上到下,调用次序是:my_decorator_1、my_decorator_2、my_decorator_3')

	
>>> script4()
从上到下,调用次序是:my_decorator_1、my_decorator_2、my_decorator_3
>>> 
>>> @my_decorator_1
@my_decorator_2
@my_decorator_3
def script4():
	print('从上到下,调用次序是:my_decorator_1、my_decorator_2、my_decorator_3')


# 等同于:my_decorator_1(my_decorator_2(my_decorator_3(script4)))

>>> script4()
1111111111111111111
我是:my_decorator_1,
2222222222222222222
我是:my_decorator_2,
3333333333333333333
我是:my_decorator_3,
从上到下,调用次序是:my_decorator_1、my_decorator_2、my_decorator_3
>>> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值