python-装饰器

Posted 醉公子~

tags:

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

装饰器,其实装饰器就是一个闭包,装饰器是闭包的一种应用。什么是装饰器呢,简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。使用时,再需要的函数前加上**@name**即可。

什么是闭包?

闭包
在函数中再嵌套一个函数,并且引用外部函数的变量

eg:

def A(x):
    def B(y):
        return x + y
    return B
print(A(1)(2))
>>>3

在代码中,在A()函数里面定义了一个B()函数,在函数B()里面引用了外部A函数里面的变量x,这就形成了一个闭包,在输出时,A(1)(2),第一个括号传进去的值返回B函数,其实就是返回1+ y,所以再传第二个参数进去,就可以得到返回值,1+ 2.

装饰器

eg:

# 打印日志,生产中用 的最多
def debug_name(name):
    def debug(func):
        def wrapper(*args, **kwargs):
            print("[DEBUG_NAME:]: enter ()".format(name,func.__name__))
            print(f'func.__name__:args,kwargs')
            ret_val = func(*args, **kwargs)
            print(f'return :ret_val')
            return ret_val
        return wrapper
    return debug

@debug_name(name="INFO")
def add(a,b):
    return a+b
add(2,5)

>>>
[DEBUG_NAME:INFO]: enter add()
add:(2, 5),
return :7

装饰器中可以传入参数,先形成一个完整的装饰器,然后再来装饰函数,当然函数如果需要传入参数也是可以的,用不定长参数符号就可以接收

类装饰器

最后就是类装饰器,它其实也就是跟平常的函数装饰器一样,用法与函数装饰器并没有太大区别,实质是使用了类方法中的call魔法方法来实现类的直接调用。

call()
该方法的功能类似于在类中重载 () 运算符,使得类实例对象可以像调用普通函数那样,以“对象名()”的形式使用

class CLanguage:
    # 定义__call__方法
    def __call__(self,name,add):
        print("调用__call__()方法",name,add)
clangs = CLanguage()
clangs("C语言中文网","http://c.biancheng.net")

类装饰器

class logging(object):

    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print("[DEBUG]: enter ()".format(self.func.__name__))
        return self.func(*args, **kwargs)

@logging
def hello(a, b, c):
    print(a, b, c)

hello("I","LOVE","YOU")

>>>
[DEBUG]: enter hello()
I LOVE YOU

参考文献:
http://c.biancheng.net/view/2380.html
https://zhuanlan.zhihu.com/p/87353829

希望这篇文章对初学python的你有用!
谢谢点赞评论!

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

函数进阶(装饰器)

迭代器,生成器,装饰器

06-python中的装饰器

python再议装饰器

Python中@符号是什么意思?

Python 装饰器