装饰器原理:不修改已实现的功能代码块,不改变原函数调用方式,只对现有功能进行扩展

装饰器

装饰带有参数的函数

ps: 装饰器函数千万不要以test命名,否则会以测试方式运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def decorator(func):  # 装饰器接受一个函数作为参数,并返回一个函数
def wrapper(*args, **kwargs): # (*args, **kwargs)表示带参数的装饰器
print('call %s(): ' % func.__name__) # 魔法函数,返回函数名
func(*args, **kwargs)
return wrapper


@decorator # 运用@语法把装饰器放置在函数定义处
def now(a,b):
print("%s:%s"%(a,b))


if __name__ == '__main__':
now("hello", "world")
"""
:return
call now():
hello:world
"""

装饰带有返回值的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def function(func): #定义了一个闭包
def func_in(*args,**kwargs): #闭包内的函数,因为装饰器运行的实则是闭包内的函数,所以这里将需要有形参用来接收原函数的参数。
print('这里是需要装饰的内容,就是需要添加的内容')
num = func(*args,**kwargs) #调用实参函数,并传入一致的实参,并且用变量来接收原函数的返回值,
return num #将接受到的返回值再次返回到新的now()函数中。
return func_in


@function
def now(a,b): # 定义一个函数
return a+b # 返回实参的和


if __name__ == '__main__':
print(now(985, 211))

装饰带有传入参数和返回值的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def decorator(func):
def inner(*args, **kwargs): # (*args, **kwargs)表示带参数的装饰器
print("开始执行带有参数的返回值装饰函数!")
print(*args, **kwargs)
result = func(*args, **kwargs) # 调用实参函数,并传入一致的实参
return result
return inner


@decorator
def now(a, b):
if a <= b:
return b-a
else:
return a-b


if __name__ == '__main__':
c = now(985, 211)
print(c)

参考文章


 评论

联系我 | Contact with me

Copyright © 2019-2020 谁知你知我,我知你知深。此恨经年深,比情度日久

博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议