zoukankan      html  css  js  c++  java
  • 装饰器

    装饰器

    什么是装饰器

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

    为何要用装饰器

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

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

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

  • 相关阅读:
    1084: 计算两点间的距离(多实例测试)
    1083: 数值统计(多实例测试)
    回文数的判断
    1082: 敲7(多实例测试)
    BZOJ 1303 [CQOI2009]中位数图
    计蒜客 Yingchuan Online F题 (Floyd 变形)
    并查集入门题
    常见错点
    单调队列入门题
    线段树入门题
  • 原文地址:https://www.cnblogs.com/zuanzuan/p/9713721.html
Copyright © 2011-2022 走看看