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>
  • 相关阅读:
    哈尔滨理工大学第六届程序设计团队 H-Permutation
    哈尔滨理工大学第六届程序设计团队 E-Mod
    哈尔滨理工大学第六届程序设计团队 I-Team
    HDU Today
    最短路
    Pseudoforest(伪最大生成树)
    Connect the Cities(prim)用prim都可能超时,交了20几发卡时过的
    Jungle Roads(最小生成树)
    linux读取yaml文件的某个属性值
    dos查看电脑配置
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9382699.html
Copyright © 2011-2022 走看看