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

    装饰器的本质 :

      一个闭包函数

    装饰器的功能 :

      在不修改原函数以及其调用方法的基础上对原函数进行功能的添加和扩展

    装饰器原则 :

      开放封闭原则

        对扩展是开放的

        对修改是封闭的

    装饰器的简单版本 :

    import time
     
    def func1():    #原函数
        print('in func1')
     
    def timer(func):    #定义函数(装饰器函数), 将原函数对象作为参数传给新函数
        def inner():
            start = time.time()    #原函数执行之前做一些操作
            func()    #原函数执行
            print(time.time() - start)    #原函数执行之后做一些操作
        return inner    #将内部函数对象返回给外部函数
     
    func1 = timer(func1)    #将自定义的函数(装饰器函数)重新赋值给原函数名
    func1()    #使用赋值之后的函数调用, 函数名没变
    
    
    
    #装饰器的语法糖
    
    import time
    def timer(func):
        def inner():
            start = time.time()
            func()
            print(time.time() - start)
        return inner
     
    @timer   #==> func1 = timer(func1)
    def func1():
        print('in func1')
     
    func1()

    带参数的装饰器 :

    def timer(func):
        def inner(a):
            start = time.time()
            func(a)
            print(time.time() - start)
        return inner
     
    @timer
    def func1(a):
        print(a)
     
    func1(1)
    
    
    
    #接任意参数的装饰器
    import time
    def timer(func):
        def inner(*args,**kwargs):
            start = time.time()
            re = func(*args,**kwargs)
            print(time.time() - start)
            return re
        return inner
     
    @timer   #==> func1 = timer(func1)
    def func1(a,b):
        print('in func1')
     
    @timer   #==> func2 = timer(func2)
    def func2(a):
        print('in func2 and get a:%s'%(a))
        return 'fun2 over'
     
    func1('aaaaaa','bbbbbb')
    print(func2('aaaaaa'))

    带返回值的装饰器 :

    import time
    def timer(func):
        def inner(*args,**kwargs):
            start = time.time()
            re = func(*args,**kwargs)
            print(time.time() - start)
            return re
        return inner
     
    @timer   #==> func2 = timer(func2)
    def func2(a):
        print('in func2 and get a:%s'%(a))
        return 'fun2 over'
     
    func2('aaaaaa')
    print(func2('aaaaaa'))
  • 相关阅读:
    12864
    经常使用的正則表達式归纳—JavaScript正則表達式
    官方原版Windows XP SP3(VOL)中文简体版ISO下载
    java final keyword
    ssh 实体关系分析确立(ER图-实体关系图)
    android uiautomator自己主动化測试
    NYOJ 891 找点
    第十一届GPCT杯大学生程序设计大赛完美闭幕
    前端学习——JQuery Ajax使用经验
    VC中获取窗体句柄的各种方法
  • 原文地址:https://www.cnblogs.com/dong-/p/9787621.html
Copyright © 2011-2022 走看看