Decorator-Python中的装饰器

本博客的内容仅为博主自己的一些理解和归纳,如有错误,欢迎指正呀~

装饰器的作用在于:不修改原函数的调用方式的情况下在原函数前后添加其他功能

装饰器是一个闭包函数,相当于是一种函数的嵌套,装饰器对扩展是开放的,对修改是封闭的

下面用一些实际例子来理解装饰器

先看一下单个装饰器的作用:

def w1(func):
    print('----w1----')
    def inner():
        print('----before----')
        func()
        print('----after----')
    return inner

@w1
def f1():
    print('----f1----')
    
# 输出:----w1----

f1()
# 输出:----before----
#      ----f1----
#      ----after----

可以看出在整个调用过程相当于把f1()给嵌入到w1()中,用w1()代替w1()中的func(),然后执行w1()

再看下一个例子,可以进一步理解函数外部和内部的执行过程

def func(functionName):
    print("----func----1----")
    def func_in():
        print("----func_in----1----")
        functionName()
        print("----func_in----2----")

    print("----func----2----")
    return func_in

@func
def test():
    print("----test----")

#test = func(test)

test()

# 运行结果
# ----func----1----
# ----func----2----
# ----func_in----1----
# ----test----
# ----func_in----2----

可以发现,先执行内嵌函数外部的操作,然后再执行内部函数,而外部函数的执行不需要函数的调用,从上面的例子也可以看出,print(----w1----)的操作在执行f1()之前

然后看一下多个装饰器的执行:

def a(func):
    print('i\'m a!')
    def e():
        print(1)
        func()
        print(2)
    return e
def b(func):
    print('i\'m b!')
    def d():
        print('a')
        func()
        print('b')
    return d
@b
@a
def c():
    print('!!!!!')
c()
# output:
# i'm a!
# i'm b!
# a
# 1
# !!!!!
# 2
# b

如果不使用装饰器,可以如以下简化

# 这里的func()表示的是e()
def b():
    print('a')
    func()
    print('b')
   

# 这里的func()表示的是c()
def b():
    print('a')
    print(1)
    func()
    print(2)
    print('b')

def b():
    print('a')
    print(1)
    print('!!!!!')
    print(2)
    print('b')    

可以看出相当于先把c()嵌套到a(),然后把a()嵌套到b()实现一级一级的嵌套

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章