首页 > 代码库 > learn_Day8 多层装饰器

learn_Day8 多层装饰器

# /user/local/bin/python
# -*- coding: utf-8 -*-
# Author: Ren Hang
    
def outer(func):  # ①
  def inner(*args, **kwargs):  # ②
    print("hello")  # ③
    r = func(*args, **kwargs)  # ④
    print("end")  # ⑤
    return r  # ⑥

  return inner  # ⑦
        
        
def outer_1(func):  # ⑧
  def inner(*args, **kwargs):  # ⑨
    print("123")  # ①〇
    r = func(*args, **kwargs)  # ①①
    print("456")  # ①②
    return r  # ①③

  return inner  # ①④
        
        
@outer  # ①⑤
@outer_1  # ①⑥
def f1(*args, **kwargs):  # ①⑦
print("超级复杂!")  # ①⑧
        
        
f1(11)  # ①⑨
----------

运行顺序: 1 >> 8 >> 15 >> 16 >> 8 >> 9 >> 14 >> 1 >> 2 >> 7 >> 19 >> 2 >> 3 >> 4 >> 9 >> 10 >> 11 >> 15 >> 18 >> 12 >> 13 >> 5 >> 6 ---------- - 代码从上往下依次运行 1 >> 8 >> 15 >> 16 >> 8 >> 9 >> 14 >> 1 >> 2 >> 7 >> 19 - 19 :运行f1函数,f1可以是任意参数 >> 2 - 2:因为函数f1上加上了装饰器outer,运行outer内的inner函数 >> 3 >> 4 - 4:因为outer为装饰器,装饰器加在outer_1上,所以outer_1函数作为outer的参数,r = func()相当于r = inner(),执行inner函数内的代码 9 >> 10 >> 11 - 11:因为outer_1为装饰器,装饰器加在f1上,所以f1函数作为outer_1的参数 r = func()相当于r = f1(),执行f1函数内的代码>> 15 >> 18 >> 12 >> 13 >> 5 >> 6 上面的代码,相当于下面的代码 ----------
    def inner(*args, **kwargs):  # ②
        print("hello")  # ③
        print("123")  # ①〇
        # r = func(*args, **kwargs)  # ④
        r = print("超级复杂!")  # ①⑧
        print("456")  # ①②
        print("end")  # ⑤
        # return r  # ⑥
    
    
    inner()

 

learn_Day8 多层装饰器