Python学习之路7?装饰器

一:命名空间与作用域

1.1命名空间

局部命名空间:

def foo():

  x=1

  def func():

    pass

全局命名空间:

import time

class ClassName:pass

def foo():pass

内键命名空间:

sum,max,min 等

python加载三个命名空间的顺序:

1.内键命名空间

2.全局命名空间:文件级别的或叫做模块级别的

3.局部命名空间:只有调用函数的时候才会加载,函数调用结束就被释放掉

1.2作用域

全局作用域:

 1 同时x=1为全局变量
 2 x=1
 3 def func1():
 4     def func2():
 5         def func3():
 6             print(x)
 7         func3()
 8     func2()
 9 func1()
10
11 输出结果
12 1

局部作用域:

 1 x=1
 2 def func1():
 3     def func2():
 4         def func3():
 5             x=100
 6             print(x)
 7         func3()
 8     func2()
 9 func1()
10
11
12 输出结果:
13 100

二:装饰器

2.1 什么是装饰器

器即函数

装饰即修饰,意指为其他函数添加新功能

装饰器定义:本质就是函数,功能是为其他函数添加新功能

2.2 实现装饰器知识储备

装饰器=高阶函数+函数嵌套+闭包

2.3 装饰器需要遵循的原则

1.不修改被装饰函数的源代码(开放封闭原则)

2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式

3装饰器是在遵守1和2的前提下,为被装饰的对象添加新功能

2.4 装饰器无参基本框架

1 #这就是一个实现一个装饰器最基本的架子
2 def timer(func):
3     def wrapper():
4         func()
5     return wrapper

2.5 装饰器有参基本框架

1 def timer(func):
2     def wrapper(*args,**kwargs):
3          func(*args,**kwargs)
4     return wrapper

2.6 无参装饰器

 1 import time
 2 def timer(func): #func=最原始的index
 3     def warpper():
 4         start_time=time.time()
 5         func()
 6         end_time=time.time()
 7         print(‘run time is %s‘ % (end_time - start_time))
 8     return warpper
 9
10 #无参装饰器
11 @timer #index=timer(index) 此时的index就是warpper
12 def index():
13     time.sleep(1)
14     print("welcome to index")
15
16 index()#就是在调用warpper()
17
18 原来的index的函数只会输出welcome to index
19 加上装饰器后;
20 输出内容为:
21 welcome to index
22 run time is 1.0060575008392334

2.7 有参数装饰器

 1 import time
 2 def timer(func): #func=最原始的index
 3     def warpper(user):
 4         start_time=time.time()
 5         func(user)
 6         end_time=time.time()
 7         print(‘run time is %s‘ % (end_time - start_time))
 8     return warpper
 9
10 @timer #index=timer(index) 此时的index就是warpper
11 def home(user):
12     time.sleep(1)
13     print("home %s"% user)
14
15 home(‘tom‘)#就是在调用warpper()
16
17 输出结果:
18 home tom
19 run time is 1.0000574588775635

2.8 如果传入的参数是关键字类型

 1 import time
 2 def timer(func): #func=最原始的index
 3     def warpper(*args,**kwargs):
 4         start_time=time.time()
 5         func(*args,**kwargs)
 6         end_time=time.time()
 7         print(‘run time is %s‘ % (end_time - start_time))
 8     return warpper
 9
10 @timer #index=timer(index) 此时的index就是warpper
11 def home(user):
12     time.sleep(1)
13     print("home %s"% user)
14
15 home(‘tom‘)#就是在调用warpper()
16 home(user="yyp")
17 #输出结果:
18 home tom
19 run time is 1.0000574588775635
20 home yyp
21 run time is 1.0000569820404053

2.9 如果原函数有返回值

 1 import time
 2 def timer(func): #func=最原始的index
 3     def warpper(*args,**kwargs):
 4         start_time=time.time()
 5         res=func(*args,**kwargs)
 6         end_time=time.time()
 7         print(‘run time is %s‘ % (end_time - start_time))
 8         return res
 9     return warpper
10
11 @timer #index=timer(index) 此时的index就是warpper
12 def home(user):
13     time.sleep(1)
14     return user + ‘ is student‘
15
16 res=home(‘tom‘)#就是在调用warpper()
17 print(res)
18 #输出结果:
19 run time is 1.0000574588775635
20 tom is student

三:闭包

闭包:本质就是一个内部函数

特点:这个内部函数必须包含对外部函数作用域(非全局作用)名字的引用

示例:

 1 def f1():
 2     x=1
 3     y=2
 4     def f2():
 5         print(x)
 6         print(y)
 7     return f2
 8
 9 func=f1()
10 #func()
11 print(func.__closure__[0].cell_contents)#查看闭包函数的方法
12 print(func.__closure__[1].cell_contents)
13
14 #f2为闭包函数
15
16 输出结果:
17 1
18 2

惰性计算:啥时候用啥时候调用

 1 from urllib.request import urlopen
 2
 3 def page(url):
 4     def get():
 5         return urlopen(url).read()
 6     return get
 7
 8 baidu=page(‘http://www.baidu.com‘)
 9 python=page(‘http://www.python.org‘)
10
11 print(baidu)
12 print(python)
13
14 输出结果:
15 <function page.<locals>.get at 0x0000000002DE6BF8>
16 <function page.<locals>.get at 0x0000000002DE6C80>
17
18 函数没有执行,已经传了一个参数

四:装饰器应用示例

 1 user_list=[
 2     {‘name‘:‘tom‘,‘passwd‘:‘123‘},
 3     {‘name‘:‘yyp‘,‘passwd‘:‘123‘},
 4     {‘name‘:‘sy‘,‘passwd‘:‘123‘},
 5     {‘name‘:‘ly‘,‘passwd‘:‘123‘},
 6 ]
 7
 8 current_user={‘username‘:None,‘login‘:False}
 9
10 def auth_deco(func):
11     def wrapper(*args,**kwargs):
12         if current_user[‘username‘] and current_user[‘login‘]:
13             res=func(*args,**kwargs)
14             return res
15         username=input(‘用户名: ‘).strip()
16         passwd=input(‘密码: ‘).strip()
17
18         for index,user_dic in enumerate(user_list):
19             if username == user_dic[‘name‘] and passwd == user_dic[‘passwd‘]:
20                 current_user[‘username‘]=username
21
22                 current_user[‘login‘]=True
23                 res=func(*args,**kwargs)
24                 return res
25                 break
26         else:
27             print(‘用户名或者密码错误,重新登录‘)
28
29     return wrapper
30
31 @auth_deco
32 def index():
33     print(‘欢迎来到主页面‘)
34
35 @auth_deco
36 def home():
37     print(‘这里是你家‘)
38
39 def shopping_car():
40     print(‘查看购物车啊亲‘)
41
42 def order():
43     print(‘查看订单啊亲‘)
44
45 print(user_list)
46 # index()
47 print(user_list)
48 home()

无参装饰器

 1 user_list=[
 2     {‘name‘:‘tom‘,‘passwd‘:‘123‘},
 3     {‘name‘:‘yyp‘,‘passwd‘:‘123‘},
 4     {‘name‘:‘sy‘,‘passwd‘:‘123‘},
 5     {‘name‘:‘ly‘,‘passwd‘:‘123‘},
 6 ]
 7
 8 current_user={‘username‘:None,‘login‘:False}
 9 def auth(auth_type=‘file‘):
10     def auth_deco(func):
11         def wrapper(*args,**kwargs):
12             if auth_type == ‘file‘:
13                 if current_user[‘username‘] and current_user[‘login‘]:
14                     res=func(*args,**kwargs)
15                     return res
16                 username=input(‘用户名: ‘).strip()
17                 passwd=input(‘密码: ‘).strip()
18
19                 for index,user_dic in enumerate(user_list):
20                     if username == user_dic[‘name‘] and passwd == user_dic[‘passwd‘]:
21                         current_user[‘username‘]=username
22                         current_user[‘login‘]=True
23                         res=func(*args,**kwargs)
24                         return res
25                         break
26                 else:
27                     print(‘用户名或者密码错误,重新登录‘)
28             elif auth_type == ‘ldap‘:
29                 print(‘巴拉巴拉小魔仙‘)
30                 res=func(*args,**kwargs)
31                 return res
32         return wrapper
33     return auth_deco
34
35
36 #auth(auth_type=‘file‘)就是在运行一个函数,然后返回auth_deco,所以@auth(auth_type=‘file‘)
37 #就相当于@auth_deco,只不过现在,我们的auth_deco作为一个闭包的应用,外层的包auth给它留了一个auth_type=‘file‘参数
38 @auth(auth_type=‘ldap‘)
39 def index():
40     print(‘欢迎来到主页面‘)
41
42 @auth(auth_type=‘ldap‘)
43 def home():
44     print(‘这里是你家‘)
45
46 def shopping_car():
47     print(‘查看购物车啊亲‘)
48
49 def order():
50     print(‘查看订单啊亲‘)
51
52 # print(user_list)
53 index()
54 # print(user_list)
55 home()

有参装饰器

时间: 2024-10-30 14:10:27

Python学习之路7?装饰器的相关文章

Python学习之路:装饰器前奏

装饰器: 定义:本质是函数,功能:(装饰其他函数)就是为其他函数添加附加功能: 原则:1.不能修改被装饰函数的源代码 2.不能修改被装饰的函数的调用方式 实现装饰器知识储备: 1.函数即"变量" 2.高阶函数 3.嵌套函数 高阶函数+嵌套函数 =>装饰器 import time def timer(func): def warper(*args,**kwargs): start_time =time.time() func() stop_time=time.time() prin

Python学习之路:装饰器实现终极版

网站实现验证功能装饰器: import time user,passwd='alex','abc123' def auth(func): def wrapper(*args,**kwargs): print("wraper func args:",*args,**kwargs) username=input("Username:").strip() password=input("Password:").strip() if user==user

Python学习之三大名器-装饰器、迭代器、生成器

Python学习之三大名器-装饰器.迭代器.生成器 一.装饰器     装饰,顾名思义就是在原来的基础上进行美化及完善,器这里指函数,所以说装饰器就是装饰函数,也就是在不改变原来函数的代码及调用方式的前提下对原函数进行功能上的完善.其核心原理其实是利用闭包.     格式 @关键字+装饰函数          被装饰函数()      注意:@行必须顶头写而且是在被装饰函数的正上方     按照形式可以分为:无参装饰器和有参装饰器,有参装饰器即给装饰器加上参数     以下示例是一个无参装饰器,

python学习笔记7:装饰器

一.什么是装饰器 装饰器,它本身是一个函数. 装饰器的作用在于,在不改变现有函数的调用方式的前提下,给其新增一些功能:这些功能一般都是公用的. 它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限校验等场景.(此句引用:https://zhuanlan.zhihu.com/p/25648515) 二.学装饰器的前提知识 1.函数即变量 2.高阶函数 3.函数嵌套 以上三个知识点,在我的上一篇博客'python学习笔记6:函数'里 有详细介绍,这里不赘述 三.一个例子 1.场

Python成长之路_装饰器

一.初入装饰器 1.首先呢我们有这么一段代码,这段代码假如是N个业务部门的函数 1 def f1(aaa): 2 print('我是F1业务') 3 if aaa == 'f1': 4 return 'ok' 5 6 def f2(aaa): 7 print('我是F2业务') 8 if aaa == 'f2': 9 return 'ok' 业务代码 这里呢也就是当我们调用上面的函数的时候,传入值给aaa,当aaa的值等于f1或者f2就返回ok 2.公司有N个业务部门,1个基础平台部门,基础平台

python 学习笔记7(装饰器)

闭包(closure)是函数式编程的重要的语法结构. 定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). def outer(): x = 1 def inner(): print(x) return inner f = outer() f() inner就是内部函数,inner里引用了外部作用域的变量x(x在外部作用域outer里面,不是全局作用域),则这个内部函数inner就是一个闭包. 闭包=函数块+定义函数时的环

python学习进度14(装饰器)

由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25') ... >>> f = now >>> f() 2015-3-25 函数对象有一个__name__属性,可以拿到函数的名字: >>> now.__name__ 'now' >>> f.__name__ 'now' 现在,假设我们要增强now()函数的功能,比如

Python学习(十)—— 装饰器和函数闭包

装饰器 装饰器:本质就是函数,功能是为其他函数添加附加功能 原则: 1.不修改被修饰函数的源代码 2.不修改被修饰函数的调用方式 统计程序运行的时间(不使用装饰器): 这种方法修改了源代码,不能用于已经上线的程序 1 import time 2 def calc(l): 3 res = 0 4 start_time = time.time() 5 for i in l: 6 res += i 7 time.sleep(0.01) 8 stop_time = time.time() 9 print

python学习第十一天 装饰器

1.作业讲解 # 2.写函数,接收n个数字,求这些参数数字的和.def sum_func(*args): total = 0 for i in args: total += i return totalprint(sum_func(1,2,3,8,23,6)) # 3.读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么?# a=10# b=20# def test5(a,b):# print(a,b)# c = test5(b,a)# print(c) # 4.读代码,回答:代码中,