python函数-装饰器

python函数-装饰器

1.装饰器的原则--开放封闭原则

 开放:对于添加新功能是开放的

封闭:对于修改原功能是封闭的

2.装饰器的作用

在不更改原函数调用方式的前提下对原函数添加新功能

3.装饰器的本质--闭包

4.装饰器

  (1)简单的装饰器

def deco(f):
    def wrapper():
        """原函数前添加的功能"""
        f()
        """原函数后添加的功能"""
    return wrapper

def func():
    print('这是原函数!')

func = deco(func)
func()

 

  (2)装饰器的语法糖-----@deco

def deco(f):
    def wrapper():
        """原函数前添加的功能"""
        f()
        """原函数后添加的功能"""
    return wrapper

@deco # ——>此处效果等同于 func = deco(func)
def func():
    print('这是原函数')

func()

 

  (3)带返回值的装饰器

def deco(f):
    def wrapper():
        """原函数前添加的功能"""
        res = f()
        """原函数后添加的功能"""
        return res
    return wrapper

@deco
def func():
    print('这是原函数')
func()

 

  (4)装饰器加参数的固定格式

def deco(f):
    def wrapper(*args,**kwargs):
        """原函数前添加的功能"""
        res = f(*args,**kwargs)
        """原函数后添加的功能"""
        return res
    return wrapper

@deco
def func(*args,**kwargs):
    print('这是原函数')
func()

 

  (5)装饰器的固定格式--wraps版

from functools import wraps

def wrapper(func):
    @wraps(func)
    def inner(*args,**kwargs):
        print('在被装饰的函数执行之前做的事')
        ret = func(*args,**kwargs)
        print('在被装饰的函数执行之后做的事')
        return ret
    return inner
@wrapper
def holiday(day):
    print("新年快乐")
    return '好开心'
print(holiday.__name__)
print(holiday.__doc__)
ret = holiday(3)
print(ret)


>>>>
holiday
None
在被装饰的函数执行之前做的事
新年快乐
在被装饰的函数执行之后做的事
好开心

  

  (6)多个装饰器装饰一个函数 

def wrapper1(func):
    def inner1():
        print('wrapper1 ,before func')
        func()
        print('wrapper1 ,after func')
    return inner1

def wrapper2(func):
    def inner2():
        print('wrapper2 ,before func')
        func()
        print('wrapper2 ,after func')
    return inner2

@wrapper2 # 将inner1进行装饰,即inner1 = wrapper2(inner1) = inner2
@wrapper1 # 先执行这个装饰器,即f = wrapper1(f) = inner1
def f():
    print('in f')

f()

>>>>
wrapper2 ,before func
wrapper1 ,before func
in f
wrapper1 ,after func
wrapper2 ,after func

 

  

  

posted @ 2018-02-24 21:16  流年中渲染了微笑  阅读(223)  评论(0编辑  收藏  举报