首页 > 编程语言 >python 装饰器

python 装饰器

时间:2023-05-04 13:55:11浏览次数:38  
标签:function 函数 python args result kwargs 装饰

装饰器(Decorator)是Python语言中的一种高级技巧,可以在不改变原有代码的基础上,动态地给函数或类增加额外的功能。本质上,装饰器就是一个普通函数,它可以接受一个或多个参数,并且返回一个函数作为结果。

装饰器的语法如下:

@decorator_function
def function_to_be_decorated():
    # Function body

其中 decorator_function 表示装饰器函数,function_to_be_decorated 表示要被装饰的函数。

注意事项:

  1. 装饰器必须是一个可调用的对象(callable),即函数、类或实现了 __call__ 魔法方法的类的实例。
  2. 装饰器可以有多层嵌套,在应用多个装饰器时,从内到外依次执行。
  3. 装饰器可以接受参数,例如 @decorator(arg1, arg2)
  4. 被装饰的函数的元信息(比如文档字符串、名称、注释和参数签名)会丢失,需要使用 functools.wraps() 函数来解决这个问题。

下面是一个简单的装饰器示例,用于计算函数运行时间:

import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Function {func.__name__} took {end_time - start_time:.2f} seconds to run.")
        return result
    return wrapper

@timing_decorator
def my_function():
    # Function body

my_function()

该装饰器函数接受一个函数作为参数,返回一个包装器函数,用于统计被装饰函数的运行时间。注意,在 wrapper() 函数中,使用了可变长参数 *args 和关键字参数 **kwargs 来接收任意数量和类型的参数,并将它们传递给原始函数。

输出结果类似于:

Function my_function took 0.00 seconds to run.

再举一个装饰器的例子,用于验证用户是否具有访问权限:

def authenticated(func):
    def wrapper(*args, **kwargs):
        # 模拟身份验证
        is_authenticated = True  # 假设用户已登录
        if is_authenticated:
            return func(*args, **kwargs)
        else:
            return "Access denied. Please log in first."
    return wrapper

@authenticated
def my_function():
    # Function body

result = my_function()
print(result)

该装饰器函数接受一个函数作为参数,返回一个包装器函数,用于检查用户是否已经登录。如果用户已登录,则调用原始函数并返回结果;否则返回一个错误信息。

输出结果类似于:

Function result.

再举一个装饰器的例子,用于打印函数调用日志:

def logger(func):
    def wrapper(*args, **kwargs):
        print(f"Calling function {func.__name__} with arguments: args={args}, kwargs={kwargs}")
        result = func(*args, **kwargs)
        return result
    return wrapper

@logger
def my_function(x, y):
    # Function body

result = my_function(1, 2)
print(result)

该装饰器函数接受一个函数作为参数,返回一个包装器函数,用于在函数被调用时输出日志信息。在 wrapper() 函数中,先打印出函数名称和参数列表,再调用原始函数,并返回结果。

接下来使用装饰器语法 @logger 来修饰一个名为 my_function 的函数,该函数接受两个参数 xy。在代码末尾调用 my_function(1, 2),以触发装饰器的执行,并输出结果。

输出结果类似于:

Calling function my_function with arguments: args=(1, 2), kwargs={}
result.

总之,装饰器是Python语言中非常灵活和强大的特性,可以帮助我们实现各种功能,例如计时、身份验证、日志记录等。但是,在使用装饰器时需要注意一些细节和陷阱,例如装饰器顺序、装饰器内部变量作用域等。因此,我们需要谨慎地使用装饰器,并根据实际情况选择最佳的方案。

标签:function,函数,python,args,result,kwargs,装饰
From: https://www.cnblogs.com/yund/p/17371002.html

相关文章

  • python 为什么在python脚本中import就可以引用别人的包
    目录python为什么在python脚本中import就可以引用别人的包编写一个包打包。发布到PyPIpython为什么在python脚本中import就可以引用别人的包Python中的import语句可以将已有的代码模块导入到当前的程序中,方便我们复用代码。如果你想让别人在其电脑上导入你写的包,有以下几......
  • python 内置函数map()、filter()函数
    map()函数接受两个参数:第一个参数是一个函数,第二个参数是一个可迭代对象(如列表、元组等)。该函数会将可迭代对象中的每个元素依次传递给第一个参数指定的函数,并返回一个新的可迭代对象,其中每个元素都是原始对象经过该函数转换后的结果。具体来说,map()函数会将可迭代对象中的每个......
  • python 函数
    在Python中,函数是一段代码块,用于完成特定的任务。函数通常接受一个或多个参数,并返回一个结果。根据函数的定义方式和参数类型,可以将Python函数分为以下几类:内置函数:Python内置了很多常用的函数,如 print()、len()、int() 等。自定义函数:使用 def 关键字可以自定义函数......
  • python 匿名函数(lambda函数)
    Python中的匿名函数是指没有命名标识符的函数,通常被称为lambda函数。与普通函数不同,它们是一种更加简洁的方式来编写小型临时函数。在Python中,匿名函数使用关键字lambda来定义,其语法如下:lambdaarguments:expression其中,arguments表示函数参数,可以是一个或多个,多个参数之间用......
  • python+playwright 学习-24 判断页面元素状态的几种方式
    前言在操作元素之前,可以先判断元素的状态。判断元素操作状态也可以用于断言。常用的元素判断方法page对象调用的判断方法,传一个selector定位参数page.is_checked(selector:str)#checkboxorradio是否选中page.is_disabled(selector:str)#元素是否可以点击或编辑page.i......
  • 【Python】orm 按日期分类
    1.Trunc#获取每个月count总数fromdjango.db.modelsimportSumfromdjango.db.models.functionsimportTruncmodels.NafpComplete.objects.filter().annotate(month=Trunc('point_time','month')).values('month').annotate(count=Sum('......
  • 【访问者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
    简介访问者模式(VisitorPattern)是一种行为型模式。它封装一个访问者类,把各元素类的操作集合起来,目的是将数据结构与数据操作分离。在不改变原有元素类数据结构的前提下,改变了元素类的执行算法。当某些较为稳定的东西(数据结构或算法),不想直接被改变但又想扩展功能,这时候适合用访问......
  • Python网络爬虫原理及实践 | 京东云技术团队
    作者:京东物流田禹1网络爬虫网络爬虫:是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。网络爬虫相关技术和框架繁多,针对场景的不同可以选择不同的网络爬虫技术。2Scrapy框架(Python)2.1.Scrapy架构2.1.1.系统架构2.1.2.执行流程总结爬虫开发过程,简化爬虫执行流程如下图......
  • python pandas 生成excle
    首先需要导包需要两个包分别是pandas和openpyxlpipinstall-i https://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com pandaspipinstallopenpyxl 创建Python开始写入#使用pandas生成xlsx的excel文件importpandasaspdimportpandasaspddata=......
  • python+playwright 学习-60 在打开的多个标签页窗口灵活切换
    前言当页面打开了多个标签页后,如何切换到自己需要的标签页上呢?使用场景以百度首页为例,当打开多个标签页后,如何切换到自己想要的页面上操作。通过context.pages可以获取到所有的page对象,每一个page对象就代表一个标签页实例fromplaywright.sync_apiimportsync_playwrigh......