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>
  • 相关阅读:
    多项式乘法
    容斥计算多重组合
    D. Tokitsukaze, CSL and Stone Game
    优惠买商品(dp、greedy)
    数星星(单点更新,求前缀和)
    信息推送(单点更新,求前缀和)
    互相送礼物
    Codeforces Round #611 (Div. 3)E. New Year Parties
    多源bfs
    mysql事务和锁
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9382699.html
Copyright © 2011-2022 走看看