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

 

 

 

 

 

 

 

 

posted on 2018-03-24 13:39  Artisan正传  阅读(109)  评论(0)    收藏  举报