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\n'% 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>
posted @ 2018-07-28 17:26  小a玖拾柒  阅读(295)  评论(0编辑  收藏  举报