Python3.7学习笔记25-装饰器

Python3.7学习笔记25-装饰器

我们在之前的学习中其实接触过很多的装饰器。它本质其实就是一个函数。

  • 下面这段代码。变量test指向了内部函数wrapper() 而内部函数wrapper()中又调用了原函数demo8,因此执行顺序是先打印模拟装饰器。然后在执行demo8。 这里的demo7() 其实就是一个装饰器。它把真正需要执行的函数demo8包裹在其中,并且改变了它的行为,但是原函数demo8()不变。
def demo7(func):
    def wrapper():
        print('模拟装饰器')
        func()
    return wrapper

def demo8():
    print('简单装饰器的应用')

test = demo7(demo8)
test()


/usr/local/bin/python3.7 /Users/zhonglinglong/PycharmProjects/whole_world/临时文件.py
模拟装饰器
简单装饰器的应用

Process finished with exit code 0

 它的标准写法如下。@称为语法糖。@demo7  等价与上面的 test = demo7(demo8)。只不过更加简洁。

def demo7(func):
    def wrapper():
        print('模拟装饰器')
        func()
    return wrapper

@demo7
def demo8():
    print('简单装饰器的应用')

demo8()


/usr/local/bin/python3.7 /Users/zhonglinglong/PycharmProjects/whole_world/临时文件.py
模拟装饰器
简单装饰器的应用

Process finished with exit code 0

如果原函数有一个参数的话 则在装饰函数中加入参数

def demo7(func):
    def wrapper(msg):
        print('模拟装饰器')
        func(msg)
    return wrapper

@demo7
def demo8(msg):
    print('简单装饰器的应用'+msg)

demo8('有参数的原函数')

/usr/local/bin/python3.7 /Users/zhonglinglong/PycharmProjects/whole_world/临时文件.py
模拟装饰器
简单装饰器的应用有参数的原函数

Process finished with exit code 0

 如果有几个函数都想用这个装饰器 然后每个函数的参数还不一样该怎么办? 如果自定义函数那节还有印象的话。应该马上可以想出解决办法。因为本质上就是函数。所以可以使用不定长元组参数和关键字参数

import functools


def demo7(func):
    @functools.wraps(func) # 保留原函数的元信息(函数名称等信息) 这个可加可不加 对功能无影响
    def wrapper(*args,**kwargs):
        print('模拟装饰器')
        func(*args,**kwargs)
    return wrapper

@demo7
def demo8(msg):
    print('简单装饰器的应用'+msg)

demo8('有参数的原函数')

 装饰器函数本身也是可以定义参数

def demo6(m):
    def demo7(func):
        def wrapper(*args,**kwargs):
            print(m)
            print('模拟装饰器')
            func(*args,**kwargs)
        return wrapper
    return demo7

@demo6('装饰器函数的参数')
def demo8(msg):
    print('简单装饰器的应用'+msg)

demo8('有参数的原函数')

函数可以使用多个装饰器 


def demo6(m):
    def demo7(func):
        def wrapper(*args,**kwargs):
            print(m)
            print('模拟装饰器6')
            func(*args,**kwargs)
        return wrapper
    return demo7

def demo1(m):
    def demo2(func):
        def wrapper(*args,**kwargs):
            print(m)
            print('模拟装饰器1')
            func(*args,**kwargs)
        return wrapper
    return demo2

@demo1('装饰器函数的参数1')
@demo6('装饰器函数的参数6')
def demo8(msg):
    print('简单装饰器的应用'+msg)

demo8('多个装饰器')


/usr/local/bin/python3.7 /Users/zhonglinglong/PycharmProjects/whole_world/临时文件.py
装饰器函数的参数1
模拟装饰器1
装饰器函数的参数6
模拟装饰器6
简单装饰器的应用多个装饰器

Process finished with exit code 0

 

装饰器功能非常强大。一般用来打印日志 缓存 用户登录等场景

你可能感兴趣的:(python学习笔记)