装饰器

装饰器

什么是装饰器

装饰器是用来给某个功能添加新功能的工具。
装饰器本身可以是任意可调用的对象,被装饰的对象也可以是任意可调用的对象。

为何要用装饰器

想要在不修改功能源代码以及调用方式的前提下为原功能添加新功能。

装饰器是闭包函数的应用
闭包函数=函数对象+函数嵌套定义+作用域
闭包函数指的是定义在函数内部的函数,并且该内部函数包含对外层函数作用域名称的引用。
闭包函数

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关键字是把局部变量声明为上一层的作用域

原文地址:https://www.cnblogs.com/zuanzuan/p/9713721.html