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

  • 相关阅读:
    Eclipse 代码提示功能设置。
    eclipse android 查看源文件 出错的解决办法
    Android 中自定义控件和属性(attr.xml,declarestyleable,TypedArray)的方法和使用
    android屏幕尺寸 sp,px,dp,density,in介绍
    用C#实现的条形码和二维码编码解码器 之转载
    在Eclipse下如何导入jar安装包
    C# 获取往控件中拖进的文件或文件夹的信息(转)
    c#中Dictionary、ArrayList、Hashtable和数组的区别是什么?[转]
    C#中的枚举
    C#结构体特性
  • 原文地址:https://www.cnblogs.com/zuanzuan/p/9713721.html
Copyright © 2011-2022 走看看