python装饰器
闭包
满足两个条件:一个内部函数,对在对其外部作用域(嵌套作用域)变量引用,那么这个内部函数就是闭包。
装饰器
本质上是一种特殊的函数,为之前的函数添加特殊的功能。
功能函数可以增加参数,装饰器函数也能接受参数。
1 # 简单装饰器 2 def decorator(f): 3 def inner(): 4 print("装饰器开始") 5 f() 6 print("装饰器结束") 7 return inner # 此处返回的是函数名称 8 9 10 def foo(): 11 print("原函数!") 12 13 14 # 装饰器基本解释原理 15 foo = decorator(foo) # 此处返回的是inner所指向的地址 16 foo()
1 # 装饰器实现 2 def decorator(f): 3 def inner(): 4 print("装饰器开始") 5 f() 6 print("装饰器结束") 7 return inner # 此处返回的是函数名称 8 9 @decorator 10 def foo(): 11 print("原函数!") 12 13 14 foo()
装饰器的参数传递
1 # 装饰器传递参数 2 def decorator(f): 3 def inner(x, y): 4 print("装饰器开始") 5 f(x, y) 6 print("装饰器结束") 7 return inner # 此处返回的是函数名称 8 9 @decorator 10 def foo(x, y): 11 print("原函数!") 12 print(x + y) 13 print("原函数!") 14 15 foo(6, 7)
装饰器增加判断
1 # 装饰器参数 2 def outer(flag = "true"): 3 def decorator(f): 4 def inner(x, y): 5 print("----装饰器开始") 6 f(x, y) 7 print("----装饰器结束") 8 if flag == "true": 9 print("----装饰器判断") 10 return inner # 此处返回的是函数名称 11 return decorator 12 13 @outer("true") 14 def foo(x, y): 15 print("原函数!") 16 print(x + y) 17 print("原函数!") 18 19 foo(6, 7)
装饰器应用
装饰器应用京东登陆
1 def login(auth_type = "jingdong"): 2 def func(f): # 如果不添加这个函数,程序也能执行,但会报错 3 def inner(): 4 global login_status 5 if not login_status: 6 if auth_type == "jingdong": 7 username = input("京东账号:") 8 password = input("京东密码:") 9 if user == username and passwd == password: 10 print("账号登陆成功") 11 login_status = True 12 f() 13 elif auth_type == "weixin": 14 username = input("微信账号:") 15 password = input("微信密码:") 16 if user == username and passwd == password: 17 print("账号登陆成功") 18 login_status = True 19 f() 20 else: 21 print("请选择账号") 22 return inner 23 return func
浙公网安备 33010602011771号