python - 装饰器的原理和用法

简介

装饰器本质上是一个python函数或者类,它可以让其他函数或者类在不需要做任何代码修改的前提下增加额外的功能,装饰器的返回值也是一个函数/类对象。
使用场景:插入日志、性能测试、事务处理、缓存、权限校验等场景
优点:有了装饰器,我们就可以抽离出大量函数功能本身无关的雷同代码到装饰器中并继续重用,概括的讲,装饰器的作用及时为了已经存在的对象添加额外的功能。

定义

def log(func):
    def wrapper(*args,**kwargs):
        print("{}的日志".formate(func.__name__))
        return func(*args,**kwargs)
    return wrapper

调用

@log
def test_func():
    pass

背景

函数的传递性

python中的函数可以像参数一样传递给另外一个函数。

def func1():
    print("func1被执行~")

def func2(func):
    func()

func2(func1)  # func1被执行~

日志函数

import logging
logging.warning(logging message)

执行函数打印日志

import logging

def func1():
    print("func1被执行~")
    logging.warning("func1的运行日志~")

def func2(func):
    func()

func2(func1)  

执行不同的函数打印不同的日志

def func1():
    print("func1被执行~")

def func2():
    print("func2被执行~")

def func3():
    print("func3被执行~")

def func_log(func):
    logging.warning('''{}正在运行~~'''.format(func.__name__))
    func()

func_log(func1)
func_log(func2)
func_log(func3)

通过上面的例子我们发现,想要达到执行函数并且打印日志的功能,我们就需要通过调用日志函数来达到我们的目的,很难单纯的通过函数名去执行函数和打印日志,此时装饰器的好处就体现出来了…

装饰器的使用

# 装饰器的调用
def func_logging(func):
    def wrapper():
        print("{}的日志".format(func.__name__))
        func()
    return wrapper

@func_logging
def func1():
    print("func1函数被执行")

func1()
# 装饰器调用原理
def func_logging(func):  # func--->func1
    def wrapper():
        print("{}的日志".format(func.__name__))
        func()
    return wrapper # 函数

def func1():
    print("func1函数被执行")

func1 = func_logging(func1)
func1()

# 被装饰的函数带有参数(有的带参数,有的不带参数,有的参数个数不确定)
def func_logging(func):
    def wrapper(*args, **kwargs):
        print("{}的日志".format(func.__name__))
        func(*args, **kwargs)
    return wrapper

@func_logging
def func1(name):
    print("func1函数被执行",name)

@func_logging
def func2(name, age):
    print("func2函数被执行",name, age)

@func_logging
def func3():
    print("func3函数被执行")

func1('func1')
func2("func2",18)
func3()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的函数装饰器是一种特殊类型的函数,它可以用来修改其他函数的功能。装饰器可以在不修改被装饰函数源代码的情况下,为其添加额外的功能。装饰器本质上是一个返回函数的函数,它使用了闭包的概念。 Python提供了@符号作为装饰器的语法糖,使得应用装饰器更加方便。使用装饰器时,可以直接在被装饰函数的定义上方使用@符号加上装饰器函数的名称,就可以将被装饰函数作为参数传递给装饰器函数进行处理。 函数装饰器的应用场景很广泛,它可以用于添加日志记录、性能分析、权限验证、缓存等功能。通过使用装饰器,我们可以将这些功能从原始函数中分离出来,提高代码的可读性和可维护性。 以下是一个简单的示例,演示了如何使用函数装饰器: ``` def decorator(func): def wrapper(*args, **kwargs): # 添加额外的功能 print("装饰器添加的功能") # 调用原始函数 return func(*args, **kwargs) return wrapper @decorator def my_function(): print("原始函数") my_function() ``` 在上面的例子中,我们定义了一个装饰器函数`decorator`,它接受一个函数作为参数,并返回一个新的函数`wrapper`。在`wrapper`函数中,我们可以添加额外的功能,并调用原始函数。通过使用`@decorator`语法,我们将`my_function`函数传递给装饰器进行处理。 当我们调用`my_function()`时,实际上调用的是装饰器返回的`wrapper`函数。在执行`wrapper`函数之前,会先执行装饰器添加的额外功能,然后再调用原始函数。 这就是Python函数装饰器的基本原理用法。通过使用装饰器,我们可以轻松地修改函数的功能,使代码更加简洁和可重用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值