• 装饰器


    一.什么是装饰器

    器指的是工具,而程序中的函数就具备某一功能的工具

    装饰指的是为被装饰器对象添加额外功能

    就目前的知识来看:
    定义装饰器就是定义一个函数,只不过该函数的功能是用来为
    其他函数添加额外的功能

    其实:
    装饰器本身其实可以是任意可调用的对象
    被装饰的对象也可以是任意可调用的对象

    二.为什么要用装饰器

    软件的维护应该遵循开放封闭原则
    开放封闭原则指的是:
    软件一旦上线运行后对修改源代码是封闭的,对扩展功能的是开放的
    这就用到了装饰器

    装饰器的实现必须遵循两大原则:
    1、不修改被装饰对象的源代码
    2、不修改被装饰对象的调用方式
    装饰器其实就在遵循1和2原则的前提下为被装饰对象添加新功能

    三.如何使用装饰器

    无参装饰器:

    计算函数运行时间
    import
    time def index(): start=time.time() print('welcom to index') time.sleep(3) stop=time.time() print('run time is %s' %(stop-start)) index()
    import time
    def index():
        print('welcome to index')
        time.sleep(3)
    
    def f2():
        print('from f2')
        time.sleep(2)
    
    start=time.time()
    index()
    stop=time.time()
    print('run time is %s'%(stop-start))
    start=time.time()
    f2()
    stop=time.time()
    print('run time is %s'%(stop-start))

    装饰器修正:

    import rime        #时间模块
    def timmer(func)
    def wrapper(*args,**kwargs): #什么都能接收,也可以不传值 start=time.time() #计算开始时间 func(*args,**kwargs) stop=time.time() #计算结束时间 print('run time is %s'%(stop-start)) #输出所用时间 return wrapper #返回wrapper的内存地址 def index(): #定义一个名为index的函数 print('welcome to index') #执行时打印welcome to index time.sleep(3) #等待三秒钟 return 123 #返回值为123 可以没有 index=timmer(index) index()

    #这样就不会修改被装饰对象的源代码和调用方式
    基本格式
    def deco(func):
        def wrapper(*args,**kwargs):
            res=func(*args,**kwargs)
            return res
        return wrapper

    有参装饰器:

    import time
    current_user={'user':None}
    def auth(engine='file'):
        def deco(func):
            def wrapper(*args,**kwargs):
                if current_user['user']:
                    #已经登陆过
                    res = func(*args, **kwargs)
                    return res
                user=input('username>>: ').strip()
                pwd=input('password>>: ').strip()
                if engine == 'file':
                    # 基于文件的认证
                    if user == 'egon' and pwd == '123':
                        print('login successful')
                        # 记录用户登陆状态
                        current_user['user']=user
                        res=func(*args,**kwargs)
                        return res
                    else:
                        print('user or password error')
                elif engine == 'mysql':
                    print('基于mysql的认证')
                elif engine == 'ldap':
                    print('基于ldap的认证')
                else:
                    print('无法识别认证来源')
            return wrapper
        return deco
    
    @auth(engine='mysql') # @deco #index=deco(index) #index=wrapper
    def index():
        print('welcome to index page')
        time.sleep(1)
    
    @auth(engine='mysql')
    def home(name):
        print('welecome %s to home page' %name)
        time.sleep(0.5)
    
    
    index()
    home('egon')
  • 相关阅读:
    @@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的辨析
    Blue Jeans[poj3080]题解
    绿色通道题解
    后缀数组
    Power Strings[poj2406]题解
    KMP算法
    Life Forms[poj3294]题解
    STM32固件库文件编程结构思想的理解
    GPIO设置
    HTML_v2
  • 原文地址:https://www.cnblogs.com/chillwave/p/9174650.html
Copyright © 2020-2023  润新知