zoukankan      html  css  js  c++  java
  • Python学习---装饰器的学习1210

    装饰器的基础

    学习前提: 作用域 + 函数的理解 + 闭包  【学习,理解】

    代码编写原则: 对修改开放对扩展开放

    装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。

    装饰器的应用:经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等应用场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

    装饰器作用:装饰器感觉就像是内部函数的调用应用,为已经存在的对象添加额外的功能。

    原理讲解

    基础原理讲解:不更改原来函数foo()的调用的基础上添加新的功能【假设每次都调用foo】

    import  time
    # 利用内部函数 来实现装饰器
    def show_time(f):
        def inner():
            start = time.time()
            f()
            end = time.time()
            print("耗时", str(end - start))
        return inner
    def foo():
        print('foo')
        time.sleep(2)
    def bar():
        print('bar')
        time.sleep(3)
    # 这里就是装饰器,添加了新功能的同时还不影响原来的函数应用
    foo = show_time(foo)
    foo()
    bar = show_time(bar)
    bar()

    Python的装饰器的实现:

    @功能函数

    import  time
    def show_time(f):
        def inner():
            start = time.time()
            f()
            end = time.time()
            print("耗时", str(end - start))
        return inner
    @show_time   # foo = show_time(foo)
    def foo():
        print('foo')
        time.sleep(2)
    @show_time   # bar = show_time(bar)
    def bar():
        print('bar')
        time.sleep(3)
    foo()
    bar()

    装饰器之被装饰函数的参数:

    参数在功能函数上添加, 装饰器参数对应的添加即可

    import  time
    def show_time(f):
        def inner(*args):
            start = time.time()
            f(*args)
            end = time.time()
            print("耗时", str(end - start))
        return inner
    @show_time   # foo = show_time(foo)
    def foo(*args):
        summary = 0
        for i in args:
            summary += i
        print(summary)
        time.sleep(2)
    @show_time   # bar = show_time(bar)
    def bar():
        print('bar')
        time.sleep(3)
    foo(2, 4, 4)
    bar()

    装饰器之装饰函数的参数:

    多一层嵌套实现,代码更加灵活

    # foo函数添加日志的写操作, bar函数不添加
    import  time
    
    def logger():
        logger_format = '%F %T'
        with open('log.txt', 'a+', encoding='utf-8') as f:
            f.write('当前时间是:%s
    '% time.strftime(logger_format))
    def log(flag = ''):
        def show_time(f):
            def inner(*args):
                start = time.time()
                f(*args)
                end = time.time()
                print("耗时", str(end - start))
                if flag == 'true':
                    logger()
            return inner
        return show_time
    @log('true')   # 等价于@show_time('true')  / show_time = show_time('true')
    def foo(*args):
        summary = 0
        for i in args:
            summary += i
        print(summary)
        time.sleep(2)
    @log('')       # 等价于@show_time('')  / show_time = show_time('')
    def bar():
        print('bar')
        time.sleep(3)
    foo(2, 4, 4)
    bar()

    复杂装饰器

    def makebold(fn):
        def wrapper():
            return "<b>" + fn() + "</b>"
        return wrapper
    def makeitalic(fn):
        def wrapper():
            return "<i>" + fn() + "</i>"
        return wrapper
    @makebold
    @makeitalic
    def hello():
        return "hello world"
    print(hello())  #  <b><i>hello world</i></b>
  • 相关阅读:
    luogu P1833 樱花 看成混合背包
    luogu P1077 摆花 基础记数dp
    luogu P1095 守望者的逃离 经典dp
    Even Subset Sum Problem CodeForces
    Maximum White Subtree CodeForces
    Sleeping Schedule CodeForces
    Bombs CodeForces
    病毒侵袭持续中 HDU
    病毒侵袭 HDU
    Educational Codeforces Round 35 (Rated for Div. 2)
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9382699.html
Copyright © 2011-2022 走看看