装饰器
Posted zuanzuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。
装饰器
什么是装饰器
装饰器是用来给某个功能添加新功能的工具。
装饰器本身可以是任意可调用的对象,被装饰的对象也可以是任意可调用的对象。
为何要用装饰器
想要在不修改功能源代码以及调用方式的前提下为原功能添加新功能。
装饰器是闭包函数的应用
闭包函数=函数对象+函数嵌套定义+作用域
闭包函数指的是定义在函数内部的函数,并且该内部函数包含对外层函数作用域名称的引用。
闭包函数
import time
def index():
print(‘welcome to index page‘)
time.sleep(3)
return ‘something‘
def outter(func):
def wrapper():
start=time.time()
res=func()
end=time.time()
print(‘ process run time is %s‘ %(end-start))
return res
return wrapper
index=outter(index)
res = index()
print(res)
无参装饰器
编写一个计算程序运行时间的装饰器
import time
@outter
def index(name):
print(‘from %s‘%name)
time.sleep(2)
def outter(func):
def wrapper(*args,**kwargs):
start=time.time()
func(*args,**kwargs)
end=time.time()
print(‘run time is %s‘%(end-start))
return wrapper
index()
无参数装饰器模板
def outter(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
有参装饰器
import time
login_userinfo = {‘userinfo‘: None}
def outter(name=‘zz‘):
def auth(func):
def wrapper(*args, **kwargs):
if login_userinfo[‘userinfo‘] is not None:
res = func(*args, **kwargs)
input_user = input(‘username>>>‘)
input_passwd = input(‘password>>>‘)
if input_user == name and input_passwd == ‘abc‘:
print(‘login successful‘)
login_userinfo[‘userinfo‘] = input_user
res = func(*args, **kwargs)
return res
return wrapper
return auth
@outter(name=‘szz‘)
def index(name):
print(‘this is %s‘ % name)
time.sleep(2)
return ‘something‘
print(index(‘index‘))
装饰器的用途就是为了在不改变源代码的基础上添加新的功能,或者需要接收新的变量,要么直接传值给函数,要么运用闭包的原理,内层函数可以对外层函数作用域的引用,把要传的值用函数包起来传下去。
global与nonlocal
global关键字的用途是把局部变量声明为全局变量,可以在函数内部修改全局变量
nonlocal关键字是把局部变量声明为上一层的作用域
以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章