Python_装饰器Decorator

本文深入探讨了Python中装饰器的概念及应用,从高阶函数到嵌套函数,再到装饰器的具体实现方式,最后介绍了如何使用装饰器来增强函数的功能。

简介

装饰器实质上是一个函数,它把一个函数作为输入并且返回给另一个函数;主要作用于在不改变源代码的情况下,修改已经存在的函数,使函数增加新的功能

装饰器-高阶函数1

函数可以赋值给变量,即:变量可以指向函数

既然变量可以指向函数,函数的参数能接受变量,那么一个函数就能接收另一个“函数名”作为参数,这种函数就称之为高阶函数

def function(func):#接收一个函数名,这个函数名其实就相当函数的地址,通过这个函数名加上一对括号()就可以运行这个函数,如下面第四行
	print("夜晚即将来临")#装饰器新增的功能
	func()#===========>相当于z_func()

def z_func():#z_func代表的是主函数
	print("夜空中最亮的星")

function(z_func)#相当于向function传递了z_func的地址

装饰器-高阶函数1.2

def function(func):#这个func相当函数的地址,并不具实体意思,如十七行
	print("夜晚即将来临")#装饰器新增的功能
	print(func)
	return func#返回func的地址

def z_func():
	print("夜空中最亮的星")

z_func = function(z_func)#左边的z_func是一个新的变量,接收来自function的返回值,其实接收的是旧的z_func函数的地址,新的z_func通过加上()又可以运行旧的z_func函数了
z_func()

装饰器-嵌套函数1

函数的嵌套是指在一个函数内又新定义一个函数,而不是直接调用另一个函数

def foo(hh):
	print("in the foo")

	def bar():
		print("in the bar")
		print(hh)#这里的hh相当于全局变量,可以在子函数内任意调用

	bar()#调用foo函数里定义的函数

foo("hh")#调用foo

装饰器-嵌套函数1.2

def foo(hh):
	print("in the foo")

	def bar():
		print("in the bar")
		print(hh)#这里的hh相当于全局变量,可以在子函数内任意调用

	return bar#返回bar的地址

test = foo("hh")#接收子函数bar的地址
test()

装饰器-高阶函数加嵌套函数

def deco(funcTest):#等价于funcTest = func
	def function():
		print("夜晚即将来临")
		funcTest()#========>func()
	return function#相当于加上新功能的func


def func():
	print("夜空中最亮的星")


func = deco(func)
func()

装饰器-初步

def deco(funcTest):#等价于funcTest = func
	def function():
		print("夜晚即将来临")
		funcTest()#========>func()
	return function#相当于加上新功能的func


@deco#相当于func = deco(func)
def func():
	print("夜空中最亮的星")


func()

装饰器-进阶

def deco(funcTest):#等价于funcTest = func,应该是传递地址时,同时也将该函数的信息传递过去了包括它的实参
	def funcDeco(*args, **kwargs):
		print("夜晚即将来临")
		funcTest(*args, **kwargs)#========>func()
	return funcDeco



@deco#相当于func = deco(func)
def func(temp):#带参数
	print("夜空中最亮的星")
	print("in the func", temp)


func("星星真好看")

装饰器-终极版

 

def deco(deco_type):
	print("------->>>>", deco_type)

	def outer_wrapper(funcTemp):
		print("--------->>>>", funcTemp)

		def wrapper(*args, **kwargs):
			print("----------->>>>", *args, **kwargs)
			print("夜晚即将来临")

			print("---------------->>>>'deco_type' = %s 是局部变量里的全局变量,因为它位于顶层的函数内"% deco_type)
			return funcTemp(*args, **kwargs)#funcTemp()相当于func(),因为func()可能有返回值,所以wrapper()函数也要添加一个返回值, 用于返回func()的返回值

		return wrapper

	return outer_wrapper


@deco(deco_type = "txt")#添加参数
def func(temp):
	print(temp)
	return "今晚的夜空真美"


print(func("夜空中最亮的星"))

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值