装饰器的前世今生

概念
在不修改元函数或者原对象的基础上,给该函数或者对象增加新的功能

这种工作机制在python中被成为装饰器【Decorator】

语法:装饰器的本质就是一个闭包【Closure】

闭包的写法

def outter1():
	num1=10
	def inner1():
		print (num1)
	return inner1
f1=outter1()         
f1()

#装饰器的书写语法
def outter2(num):
	def inner2():
		print(num)
	return inner2
f2=outter2(34)
f2()


#注意:
#装饰器可以装饰函数或者类
#1、最简单的装饰器
def func1():
	print('111')

#语法:定义一个闭包,值不多比包中外部函数的参数是一个函数【需要被装饰的函数】
def outter2(func):
	def inner2():
		print('new~~~222')
		func()
		print('new~~~111')
	return inner2
f2=outter2(34)
f2()

好处:在不修改元函数的基础上就可以给原函数加新功能
注意:增加新功能和使用源功能没有前后之分【顺序之分】
outter【外部函数的参数函数名】被称为装饰器名称

强调:不管是普通函数还是装饰器,调用函数的时候都需要注意参数的匹配

def get_age(age):
print(“年龄 %d”%(age))
get_age(10)
get_age(-18)

#需求:书写一个装饰器,可以对年菱作出校验

def outter2(func):
	def inner2(n):
		if n<0:
			n=-n
		func(n)
	return inner2

f2=outter2(get_age)
f2(-18)

用@用于修饰某个指定的函数

#用*args和**kwargs可以接收不同长参数
def outter2(func):
	def inner2(*args,**kwargs):
		if n<0:
			n=-n
		func(*args,**kwargs)
	return inner2

@outter2
def get_age(age):
	print("年龄 %d"%(age))

多个装饰器装饰一个函数

def outter2(func1):
	def inner2(*args,**kwargs):
		print("第一个装饰器 ~~~~1")
		func1(*args,**kwargs)
	return inner2

def outter3(func2):
	def inner2(*args,**kwargs):
		print("第二个装饰器 ~~~~1")
		func2(*args,**kwargs)
	return inner2

def outter3(func3):
	def inner2(*args,**kwargs):
		print("第三个装饰器 ~~~~1")
		func3(*args,**kwargs)
	return inner2

@outter1
@outter2
@outter3
def check():
	print("check")

第一步:从下往上进行传参
@outter1
@outter2
@outter3
传参:
func3—》check 元 check-----》inner3
func2—》check(inner3) check-------》inner2
func2—》check(inner2) check-------》inner1

第二步:执行过程
check() -----》inner1()----》inner2()--------》inner3----》check原函数

工作原理:check一直修改指向的过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值