110. python高级------闭包与装饰器(5)

110. python高级------闭包与装饰器(5)

python修炼第二十四天

2019年 4月 23日 晴

1. 装饰器的定义

就是给已有函数增加额外功能的函数,它本质上就是一个闭包函数。

装饰器的功能特点:

  • 不修改已有函数的源代码
  • 不修改已有函数的调用方式
  • 给已有函数增加额外的功能
# 第一步闭包
# 第二步@语法糖

def set_fun(func):  # 这个就是传入要被装饰的函数名或者叫引用
	def call_fun():
		print(func)
		# 调用原先的函数
		func()

	return call_fun


@set_fun  # @set_fun ===> test = set_fun(test)
def test():
	print("test")

test()

说明:

2.通用装饰器的推导

  • 函数有以下几种情况
    • 无参,无返回
    • 无参,有返回
    • 有参,无返回
    • 有参,有返回
无参,无返回
#############无参,无返回##############

# 装饰器的作用是不会去更改原先函数的代码,增加额外的功能
# 装饰器的结论:
# 1.装饰前的test(原先定义的test),其实由func指向(外层函数的参数)
# 2.装饰后的test,其实调用的是call_fun(内层函数)

def set_fun(func):
	def call_fun():
		print("额外的功能")
 		# 调用原先的函数
 		func()

 	return call_fun


@set_fun  # @set_fun ===> test = set_fun(test)
def test():
 	print("test")


test()
无参,有返回
#########无参,有返回########

# 装饰器的作用是不会去更改原先函数的代码,增加额外的功能
# 装饰器的结论:
# 1.装饰前的test(原先定义的test),其实由func指向(外层函数的参数)
# 2.装饰后的test,其实调用的是call_fun(内层函数)
# 3.装饰器的道德:是不会去更改原先函数的参数及返回值

def set_fun(func):
	def call_fun():
		print("额外的功能 ")
 		# 返回原先函数的值
		return func()

 	return call_fun


@set_fun  # @set_fun ===> test = set_fun(test)
def test():
 	return 9675543


value = test()
print(value)
有参,无返回
############有参,无返回########

# 装饰器的作用是不会去更改原先函数的代码,增加额外的功能
# 装饰器的结论:
# 1.装饰前的test(原先定义的test),其实由func指向(外层函数的参数)
# 2.装饰后的test,其实调用的是call_fun(内层函数)
# 3.装饰器的道德:是不会去更改原先函数的参数及返回值


def set_fun(func):
	def call_fun(args):
	 	print("额外的功能")
		# 原先函数执行
 		func(args)

 	return call_fun


@set_fun  # @set_fun ==> test = set_fun(test)
def test(args):
	print(args)


test(123)
有参,有返回
###########有参,有返回#######

# 装饰器的作用是不会去更改原先函数的代码,增加额外的功能
# 装饰器的结论:
# 1.装饰前的test(原先定义的test),其实由func指向(外层函数的参数)
# 2.装饰后的test,其实调用的是call_fun(内层函数)
# 3.装饰器的道德:是不会去更改原先函数的参数及返回值

def set_fun(func):
	def call_fun(args):
		print("额外的功能")
 		return func(args)

	return call_fun


@set_fun
def test(args):
	return args

value = test(123)
print(value)
通用装饰器
#######通用装饰器########

# 装饰器的作用是不会去更改原先函数的代码,增加额外的功能
# 装饰器的结论:
# 1.装饰前的test(原先定义的test),其实由func指向(外层函数的参数)
# 2.装饰后的test,其实调用的是call_fun(内层函数)
# 3.装饰器的道德:是不会去更改原先函数的参数及返回值

# 装饰器
def set_fun(func):
	def call_fun(*args, **kwargs):
		print("call_fun", args)
		print("call_fun", kwargs)
		return func(*args, **kwargs)  # 拆包

	return call_fun


@set_fun  # test = set_fun(test)
def test(*args, **kwargs):
	print(args)
	print(kwargs)
	return 123


value = test(123, a=123)
print(value)

猜你喜欢

转载自blog.csdn.net/qq_40455733/article/details/89639939
今日推荐