Python中的装饰器

本文详细介绍了Python中的装饰器,包括函数、装饰器的概念,如何创建简单的、带参数的、带有自定义参数的装饰器,以及类装饰器和装饰器的嵌套。通过实例展示了装饰器在身份认证、日志记录、输入合理性检查和缓存等方面的应用,帮助读者理解和掌握装饰器的实用技巧。
摘要由CSDN通过智能技术生成

装饰器一直以来都是 Python 中很有用、很经典的一个 feature,在工程中的应用也十分广泛,比如日志、缓存等等的任务都会用到。然而,在平常工作生活中,我发现不少人,尤其是初学者,常常因为其相对复杂的表示,对装饰器望而生畏,认为它“too fancy to learn”,实际并不如此。

函数 -> 装饰器

引入装饰器之前,我们首先一起来复习一下,必须掌握的函数的几个核心概念。

第一点,我们要知道,在 Python 中,函数是一等公民(first-class citizen),函数也是对象。我们可以把函数赋予变量,比如下面这段代码:


def func(message):
    print('Got a message: {}'.format(message))
    
send_message = func
send_message('hello world')

# 输出
Got a message: hello world

这个例子中,我们把函数 func 赋予了变量 send_message,这样之后你调用 send_message,就相当于是调用函数 func()。

第二点,我们可以把函数当作参数,传入另一个函数中,比如下面这段代码:


def get_message(message):
    return 'Got a message: ' + message


def root_call(func, message):
    print(func(message))
    
root_call(get_message, 'hello world')

# 输出
Got a message: hello world

这个例子中,我们就把函数 get_message 以参数的形式,传入了函数 root_call() 中然后调用它。

第三点,我们可以在函数里定义函数,也就是函数的嵌套。这里我同样举了一个例子:


def func(message):
    def get_message(message):
        print('Got a message: {}'.format(message))
    return get_message(message)

func('hello world')

# 输出
Got a message: hello world

这段代码中,我们在函数 func() 里又定义了新的函数 get_message(),调用后作为 func() 的返回值返回。

第四点,要知道,函数的返回值也可以是函数对象(闭包),比如下面这个例子:


def func_closure():
    def get_message(message):
        print('Got a message: {}'.format(message))
    return get_message

send_message = func_closure()
send_message('hello world')

# 输出
Got a message: hello world

这里,函数 func_closure() 的返回值是函数对象 get_message 本身,之后,我们将其赋予变量 send_message,再调用 send_message(‘hello world’),最后输出了’Got a message: hello world’。

简单的装饰器

简单的复习之后,我们接下来学习今天的新知识——装饰器。按照习惯,我们可以先来看一个装饰器的简单例子:


def my_decorator(func):
    def wrapper():
        print('wrapper of decorator')
        func()
    return wrapper

def greet():
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值