装饰器

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






以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象学习之八,装饰器

thymeleaf 片段渲染后重新加载 javascript

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码