python装饰器

Posted jinyan-huang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python装饰器相关的知识,希望对你有一定的参考价值。

一、我们先看看装饰器的应用基本格式:

def decorator(func):
    def inner(*args,**kwargs):
        data = func(*args,**kwargs)
        return data
    return inner

 

外层函数中嵌套了一个内部函数,并把我们需要执行的函数地址,传入到外层函数里,最终返回一个内部函数内存地址(inner)。

应用:

def decorator(func):
    def inner(*args,**kwargs):
        print(‘在函数执行前‘)
        data = func(*args,**kwargs)
        return data
    return inner


@decorator
def fu():
    return ‘hello world‘

data = fu()
print(data)

@decorator 这个的作用:等价于fu =decorator(fu) #我们把fu重新赋值,返回inner地址给到fu.这时候inner没有被执行,fu的地址等于inner地址,并报原来fu的地址赋值给了func。

当我们执行调用fu()函数的时候,等于是执行了 inner函数,inner函数中执行了fu的函数,在外层函数中,我们已把fu函数地址赋值给了func.在执行fu()函数前,并可以做一些其他的操作,比如打印。

从上面的结果来说,装饰器可以在我们不修改原函数的基础上,做一些二次修改的功能。把原有函数封装在一另一个函数中(类似闭包)。

 

二.带参数的装饰器

基本格式:

def decorator(n):
    def x(func):
        def inner(*args,**kwagrs):
            val = []
            for i in range(n):
                data = func()
                val.append(data)
            return val
        return inner
    return x



@decorator(9)
def fu():
    return 666


data = fu()
print(data)

 多参数的装饰是在基本装饰器的基础上又加了一层嵌套,它的工作流程:

1.先执行最外层的函数,decorator(n),在内存中建立x函数,并返回了x内存函数的地址,n=作为参数,接受值

2.再执行x函数,在内存中建立了inner函数,并把被封装的函数作为参数,穿进inner只能中,等价于fu =x(fu),并返回inner内存地址,如此在装饰器当中就有2个值 n=9 func=fu

3.接下来执行fu(),相当于执行了inner函数中的代码,我们就可以使用保存下来的2个值进行下面的操作。

最终结果为:[666, 666, 666, 666, 666, 666, 666, 666, 666]

 

注:如果不使用@的情况下我们的装饰器赋值过程大致如下:

def decorator(n):
    def x(func):
        def inner(*args,**kwagrs):
            val = []
            for i in range(n):
                data = func()
                val.append(data)
            return val
        return inner
    return x



def fu():
    return 666
####工作流程####
res = decorator(9)
res1 = res(fu)
fu = res1
data = fu()
print(data)

结果跟上一个结果是一样,如果不用 @,我们使用如下方式也能达到效果。

 

以上是关于python装饰器的主要内容,如果未能解决你的问题,请参考以下文章

python 装饰器:装饰器实例内置装饰器

python 装饰器:装饰器实例内置装饰器

python 装饰器:装饰器实例类装饰器(装饰函数)

python 装饰器:装饰器实例类装饰器(装饰函数)

理解Python装饰器

python高阶3 python装饰器