9 装饰器

1.  2个函数重名

def test1():
    print('---a')
def test1():
    print('---2')

t =test1()


### 运行结果
---2

  

2.实现验证功能

  1)版本1:实现验证

def w1():
    print('---正在验证权限')
    f1()

def f1():
    print('---f1')

w1()


### 运行结果
---正在验证权限
---f1

  2)版本2:闭包

def w1(func):
    
    def inner():
        print('---正在验证权限')
        func()
    return inner


def f1():
    print('---f1')

def f2():
    print('---f2')

innerFunct = w1(f1)
innerFunct()
---正在验证权限
---f1

   

  3)版本3:函数名换成f1()

def w1(func):
    
    def inner():
        print('---正在验证权限')
        func()
    return inner

def f1():
    print('---f1')

def f2():
    print('---f2')

f1 = w1(f1)
f1()

     

 3.语法糖@w1

def w1(func):
    
    def inner():
        print('---正在验证权限')
        func()
    return inner


@w1  #相当于 f1 = w1(f1)
def f1():
    print('---f1')
@w1
def f2():
    print('---f2')

#f1 = w1(f1)
f1()
---正在验证权限
---f1
def w1(func):
    
    def inner():
        print('---正在验证权限')
        if False:
            func()
        else:
            print("---没有权限--")
    return inner


@w1  #相当于 f1 = w1(f1)
def f1():
    print('---f1')
@w1
def f2():
    print('---f2')

#f1 = w1(f1)
f1()

python解释器就会从上到下解释代码,步骤如下:

  1. def w1(func): ==>将w1函数加载到内存
  2. @w1

没错, 从表面上看解释器仅仅会解释这两句代码,因为函数在 没有被调用之前其内部代码不会被执行。

从表面上看解释器着实会执行这两句,但是 @w1 这一句代码里却有大文章, @函数名 是python的一种语法糖。

4.2个装饰器,执行顺序

#定义函数:完成包裹数据
def makeBold(fn):
    def wrapped():
        return "<b>" + fn() + "</b>"
    return wrapped

#定义函数:完成包裹数据
def makeItalic(fn):
    def wrapped():
        return "<i>" + fn() + "</i>"
    return wrapped


@makeBold
@makeItalic
def test2():
    return "hello world-2"

print(test2())
<b><i>hello world-2</i></b>

  1)分析

#定义函数:完成包裹数据
def makeBold(fn):
    def wrapped():
        print('----1')
        return "<b>" + fn() + "</b>"
    return wrapped

#定义函数:完成包裹数据
def makeItalic(fn):
    def wrapped():
        print('----2')
        return "<i>" + fn() + "</i>"
    return wrapped


@makeBold
@makeItalic
def test2():
    print('----3')
    return "hello world-2"


print(test2())
----1
----2
----3
<b><i>hello world-2</i></b>

    

    

 5.装饰器的执行时间

def w1(func):
    print("---正在装饰1----")
    def inner():
        print("---正在验证权限1----")
        func()
    return inner

#只要python解释器执行到了这个代码,那么就会自动的进行装饰,而不是等到调用的时候才装饰的
@w1
def f1():
    print("---f1---")

#在调用f1之前,已经进行装饰了
#f1()


## 运行结果
---正在装饰--

     

  2个装饰器

def w1(func):
    print('---正在装饰--') 
    def inner():
        print('---正在验证权限1--')
        func()
    
    return inner

def w2(func):
    print('---正在装饰2--') 
    def inner():
        print('---正在验证权限2--')
        func()
    
    return inner
@w2
@w1
def f1():
    print('---f1')

f1()

    

---正在装饰--
---正在装饰2--
---正在验证权限2--
---正在验证权限1--
---f1
原文地址:https://www.cnblogs.com/venicid/p/7928729.html