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'))
  • 相关阅读:
    用SecureCRT来上传和下载文件
    Linux指令--tar,gzip
    Linux指令--文件和目录属性
    Linux指令--which,whereis,locate,find
    Linux指令--head,tail
    Linux指令--more,less
    Linux指令--nl
    Linux指令--cat,tac
    Linux指令--touch
    Linux指令--cp
  • 原文地址:https://www.cnblogs.com/dong-/p/9787621.html
Copyright © 2011-2022 走看看