python装饰器

#函数名尽量避免重复,会覆盖

-----------------------------------------------------------------------------------------------------------------------------------

原理:python的原理入下图所示,在add函数直接执行return inner, 调用add函数中的inner函数。在此inner函数中,现在执行print函数,也就是你要在 f1 函数中额外"添加"的内容,再执行 f1 函数。而 f1函数是通过add中的参数传入的,是f1函数的地址。

def add(function):
    def inner():
        print('增加的内容')
        function()
    return inner
def f1():
    print('--f1--')
def f2():
    print('--f2--')
f1 = add(f1)
f1()#输出为  f1+增加的内容

---------------装饰器(上图和下图是一样的,上图是装饰器的原理)--------------------------------------------

def add(function):
    def inner():
        print('增加的内容')
        function()
    return inner
@add
def f1():
    print('--f1--')
@add
def f2():
    print('--f2--')
f1()
f2()

输出:

增加的内容
--f1--
增加的内容
--f2--

----------------------------------------------------------------------------------------

多个装饰器

多个装饰器执行的顺序是从装饰器的循序有关系的,首先执行第一个再执行第二个,其中第一个中的function()不会执行。

#!usr/bin/env python
#-*- coding:utf-8 -*-
def add(function):
    def inner():
        print('增加的内容')
        function()
    return inner
def add_2(function):
    def inner():
        print("增加的第二条内容")
        function()
    return inner

@add
@add_2
def f1():
    print('--f1--')
@add_2
@add
def f2():
    print('--f2--')
f1()
f2()
"""
输出:
增加的内容
增加的第二条内容
--f1--
增加的第二条内容
增加的内容
--f2--
"""

 

装饰器的执行时间

解释器执行到装饰器就会自动的装饰,而不是等到调用的时候才装饰的

使用 装饰器对无参数的装饰器进行装饰

#!usr/bin/env python
#-*- coding:utf-8 -*-
def add(function):
    def inner(a,b):
        print('增加的内容')
        function(a,b)
    return inner
@add
def f1(a,b):
    print('%d--f1--%d'%(a,b))
f1(1,2)

装饰器对带有返回值

#!usr/bin/env python
#-*- utf-8 -*-
def add(function):
    def innner(a):
        print('--f2--')
        return function(a)
    return innner
@add
def f1(a):
    print('---f1---')
    return a+1
print(f1(2))

通用装饰器

#!usr/bin/env python
#-*- utf-8 -*-
def add(function):
    def innner(*args,**kwargs):
        print('--f2--')
        return function(*args,**kwargs)
    return innner
@add
def f1(a):
    print('---f1---')
    return a+1
print(f1(2))

带有参数的装饰器

#!usr/bin/env python
#-*- utf-8 -*-
def add_arg(arg):
    def add(function):
        def innner(a):
            print('--f2--')
            return function(a)
        return innner
return add
@add('add')
def f1(a):
    print('---f1---')
    return a+1
print(f1(2))

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值