python之装饰器
在讨论装饰器之前,先看几个概念:
一、函数嵌套
函数的嵌套调用:在调用一个函数的过程中,又调用了其它函数。
函数的嵌套定义:在一个函数的内部,又定义另外一个函数
二、名称空间
名称空间:存放名字的地方,准确的说名称空间是存放名字与变量绑定关系的地方
内置名称空间:在python解释器启动时产生,存放一些python内置的名字
全局名称空间:在执行文件时产生,存放文件级别定义的名字
局部名称空间:在执行文件的过程中,如果调用了函数,则会产生该函数的局部名称空间,用来存放该函数内第一的名字,该名字在函数调用时生效,在函数调用结束后失效
加载顺序:内置===》全局===》局部
名字的查找顺序是:局部===》全局===》内置
三、作用域
全局作用域:全局存活,全局有效
局部作用域:临时存活,局部有效
作用域关系:在函数定义时就已经固定,于调用位置无关
在调用函数时,变量在执行之前定义或修改,打印函数执行之前定义或修改的变量:在调用函数时候,变量在执行之后定义或修改,打印函数定义之前的变量,没有在函数定义执行之前定义变量就报错。
局部名称:locals()
全局名称:globals()
四、闭包函数
1、定义在函数内部的函数
2、包含对外部作用域名字的引用,而不是对全局作用域名字的引用,那么该内部函数就成为闭包函数
五、装饰器
1、装饰器之开放封闭原则:对修改封闭,对扩展开放
2、什么是装饰器
装饰他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象
装饰器的原则:(1)、不修改被装饰对象的源代码 (2)、不修改被装饰对象的调用方式
装饰器的目的:在遵循装饰器原则的前提下,为装饰对象添加上新功能
3、装饰器的语法
被装饰对象的正上方,单独一行
@deco3
def foo():
pass
foo=deco1(deco2(deco3(foo)))
4、装饰器里的注释信息:
from functools import wraps
def timmer(func):
@wraps(func)
def wrapper(*args,**kwargs):
stat=time.time()
res=func(*args,**kwargs)
stop=time.time()
print('run time is %s' %(stop-stat))
return res
return wrapper
def index(username):
'''这是index函数'''
time.sleep(3)
print('welcome to index %s' %username)
return 123
5、函数可以被多次装饰:
def timmer(func):
@wraps(func)
def wrapper(*args,**kwargs):
stat=time.time()
res=func(*args,**kwargs)
stop=time.time()
print('run time is %s' %(stop-stat))
return res
return wrapper
dic_s={'user':None}
def timer1(func):
def wapper(*args,**kwargs):
username=input('you name:').strip()
password=input('you password:').strip()
if dic_s['user']==username:
print('1')
return func(*args,**kwargs)
with open('db.txt','r',encoding='utf-8') as f:
user_dic=eval(f.read())
if username in user_dic and password==user_dic[username]:
res=func(username)
dic_s['user']=username
return res
else:
print('user or password error')
return wapper
@timmer
@timer1
def index(username):
'''这是index函数'''
time.sleep(3)
print('welcome to index %s' %username)
return 123
浙公网安备 33010602011771号