蒙珣的博客

活好当下,做好今天该做的事情。

0%

函数装饰器

  • 函数可以当作一个变量
  • 函数的参数也可以是函数
  • 函数是可以嵌套的
1
2
3
4
5
6
7
8
# 函数可以当作一个变量
def f():
print('hello')

def f2(a):
return a

f2(f())
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 函数的参数也可以是函数
def login(username='mengxun',passwd='123456'):
if username=='mengxun' and passwd=='123456':
return 'sadfeg1234'
else:
return '帐号登录错误'

def profile(token):
if token=='sadfeg1234':
return '欢迎访问个人主页'
else:
return '请登录系统'

print(profile(login()))
1
2
3
4
5
6
7
8
9
# 函数是可以嵌套的

def f3():
def f4():
# print('hello')
return 'hello'
return f4()

print(f3())

封闭:已实现的功能代码尽可能的不要做修改

开放:对现有的功能代码可扩展

需求:在调用f1 or f2函数的时候,先打印 星际穿越,再打印 火星救援

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def getInfo(func):
def inner():
print("星际穿越")
func()
return inner

@getInfo
def f5():
print("火星救援")

def f6():
print("降临")

f5()

步骤:

  • 当我们执行getInfo函数的时候,把被装饰的函数f1当作参数来传递
  • getInfo函数的返回值会重新赋值
  • 一旦结合了装饰器后,调用f1的函数其实执行的是inner函数的内部,原来的函数f1被覆盖
  • 被装饰的函数f1重新赋值给装饰器的内层函数inner
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 函数装饰器登录案例

def login1(username='mengxun',passwd='123456'):
if username=='mengxun' and passwd=='123456':
return 'asd123d'
else:
return '帐号错误'

def profile1(token):
"""个人主页"""
if token=='asd123d':
return '你的主页信息'
else:
return '请登录,谢谢!'

def login2(func):
def inner(token):
if token=='asd123d':
return func(token)
else:
return '请登录,谢谢!'
return inner

@login2
def profile2(token):
return '你的主页信息'

print(profile2('asd123d'))
1
2
3
4
5
6
# 动态参数
def outer(func):
def inner(*args,**kwargs):
print(args,kwargs)
func()
return inner