Python进阶知识(二)

这篇具有很好参考价值的文章主要介绍了Python进阶知识(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.函数装饰器

Python装饰器是一种用于修改函数或类的行为的特殊语法构造。装饰器允许在不修改原始代码的情况下,通过将函数或类包装在另一个函数中来添加额外的功能。

装饰器通常用于以下场景:

  1. 函数的日志记录:装饰器可以用来记录函数的调用信息,如函数名称、参数和返回值等。这对于调试和性能分析非常有用。
  2. 认证和授权:装饰器可以添加身份验证和授权逻辑,确保只有经过授权的用户才能访问特定的函数或类。
  3. 缓存:装饰器可以用于缓存函数的结果,以避免重复计算相同的输入。
  4. 输入验证和转换:装饰器可以验证函数的输入参数,并在需要时进行转换,确保输入的有效性和一致性。

下面是一个简单的示例,展示如何定义和应用一个装饰器:

def decorator_function(original_function):
    def wrapper_function(*args, **kwargs):
        # 在调用原始函数之前执行的代码
        print("Before the function is called")

        # 调用原始函数
        result = original_function(*args, **kwargs)

        # 在调用原始函数之后执行的代码
        print("After the function is called")

        # 返回结果
        return result

    # 返回包装函数
    return wrapper_function

# 应用装饰器
@decorator_function
def my_function():
    print("Inside the function")

# 调用被装饰的函数
my_function()

输出结果:

sqlCopy code
Before the function is called
Inside the function
After the function is called

在上面的例子中,decorator_function 是一个装饰器函数,它接受一个原始函数作为参数,并返回一个包装函数 wrapper_function。包装函数在调用原始函数之前和之后执行额外的代码,从而实现了函数行为的修改。

装饰器使用 @ 符号应用到目标函数上。在上述例子中,通过 @decorator_function 将装饰器应用到 my_function 上,使得 my_function 在调用前后会执行装饰器中定义的代码。

在装饰器中,def wrapper_function(*args, **kwargs) 定义了一个包装函数,它接受任意数量的位置参数 args 和关键字参数 kwargs。这种形式的参数定义使用了 *** 运算符,允许将不定数量的参数传递给函数。

*args 表示将多个位置参数打包成一个元组(tuple),在函数内部可以通过 args 来访问这个元组。这样,当原始函数被调用时,可以将传递给原始函数的所有位置参数捕获到 args 中,然后在包装函数内部调用原始函数时,再将这些参数传递给原始函数。

类似地,**kwargs 表示将多个关键字参数打包成一个字典(dictionary),在函数内部可以通过 kwargs 来访问这个字典。这样,当原始函数被调用时,可以将传递给原始函数的所有关键字参数捕获到 kwargs 中,然后在包装函数内部调用原始函数时,再将这些参数传递给原始函数。

使用 *args**kwargs 的好处是,装饰器可以适应不同原始函数的参数签名。无论原始函数接受多少个参数或关键字参数,装饰器都能正确地捕获和传递这些参数,使得装饰器对不同函数的适用性更广泛。

在包装函数内部,可以根据需要访问和操作 argskwargs,例如可以对它们进行修改、添加新的参数等。然后,在调用原始函数时,可以使用 *args**kwargs 语法来将捕获的参数传递给原始函数,确保参数的正确传递。

需要注意的是,在定义装饰器时,*args**kwargs 只是约定俗成的名称,并不是固定的。你可以选择其他的名称,但建议使用习惯用法,这样可以增加代码的可读性,让其他开发者更容易理解你的代码意图。

总之,def wrapper_function(*args, **kwargs) 定义了一个接受任意数量位置参数和关键字参数的包装函数,使得装饰器可以适用于不同的函数签名。

2.类装饰器

Python类装饰器是一种装饰器形式,其中装饰器本身是一个类,而不是函数。类装饰器通过实现__call__()方法来使实例对象可调用,从而实现对函数或类的装饰。

下面是一个简单的示例,展示如何定义和应用一个类装饰器:

class DecoratorClass:
    def __init__(self, original_function):
        self.original_function = original_function

    def __call__(self, *args, **kwargs):
        # 在调用原始函数之前执行的代码
        print("Before the function is called")

        # 调用原始函数
        result = self.original_function(*args, **kwargs)

        # 在调用原始函数之后执行的代码
        print("After the function is called")

        # 返回结果
        return result

# 应用装饰器
@DecoratorClass
def my_function():
    print("Inside the function")

# 调用被装饰的函数
my_function()

输出结果:

sqlCopy code
Before the function is called
Inside the function
After the function is called

在上面的例子中,DecoratorClass 是一个类装饰器,它接受一个原始函数作为参数,并在 __init__() 方法中保存该函数的引用。通过实现 __call__() 方法,该类的实例可以被调用,即实现了可调用对象的行为。

__call__() 方法中,类装饰器定义了在调用原始函数之前和之后执行的代码。通过 self.original_function 引用原始函数,并将传递给装饰器的参数 *args**kwargs 传递给原始函数。

装饰器通过 @DecoratorClass 语法应用到目标函数上。在上述例子中,通过 @DecoratorClass 将装饰器应用到 my_function 上,使得 my_function 在调用前后会执行装饰器中定义的代码。

3.装饰器的嵌套

Python装饰器支持嵌套,也就是说一个装饰器可以被另一个装饰器所装饰。通过嵌套装饰器,可以在函数或类上应用多个装饰器,从而按照特定的顺序为其添加不同的功能。

下面是一个示例,展示了如何使用嵌套装饰器:

def decorator1(original_function):
    def wrapper_function(*args, **kwargs):
        print("Decorator 1 - Before the function is called")
        result = original_function(*args, **kwargs)
        print("Decorator 1 - After the function is called")
        return result
    return wrapper_function

def decorator2(original_function):
    def wrapper_function(*args, **kwargs):
        print("Decorator 2 - Before the function is called")
        result = original_function(*args, **kwargs)
        print("Decorator 2 - After the function is called")
        return result
    return wrapper_function

@decorator1
@decorator2
def my_function():
    print("Inside the function")

my_function()

输出结果:

Decorator 1 - Before the function is called
Decorator 2 - Before the function is called
Inside the function
Decorator 2 - After the function is called
Decorator 1 - After the function is called

在上述示例中,decorator1decorator2 是两个装饰器函数。可以看到,它们的定义与之前的例子中的装饰器函数相同。

通过在 my_function 上使用 @decorator1@decorator2,这两个装饰器被嵌套应用到 my_function 上。当调用 my_function 时,装饰器的顺序是从下到上,即先应用 decorator2,再应用 decorator1

装饰器的嵌套顺序非常重要,因为它决定了装饰器的执行顺序。在上述示例中,先执行 decorator2 的代码,然后再执行 decorator1 的代码。这种顺序可以根据实际需求进行调整。

需要注意的是,装饰器的嵌套可以有多层,你可以根据需要在函数或类上应用多个装饰器。每个装饰器都会对目标函数或类进行修改或扩展,从而实现不同的功能。

通过装饰器的嵌套,你可以灵活地组合和应用多个装饰器,以满足特定的需求,并在不修改原始代码的情况下为函数或类添加各种功能。

4.装饰器用法实例

4.1 身份认证

你登录微信,需要输入用户名密码,然后点击确认,这样,服务器端便会查询你的用户名是否存在、是否和密码匹
配等等。如果认证通过,你就可以顺利登录;如果不通过,就抛出异常并提示你登录失败。
再比如一些网站,你不登录也可以浏览内容,但如果你想要发布文章或留言,在点击发布时,
服务器端便会查询你是否登录。如果没有登录,就不允许这项操作等等
import functools
def authenticate(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
      request = args[0]
      if check_user_logged_in(request): # 如果用户处于登录状态
         return func(*args, **kwargs) # 执行函数post_comment()
      else:
         raise Exception('Authentication failed')
    return wrapper
@authenticate
def post_comment(request, ...)
这段代码中,我们定义了装饰器 authenticate;而函数 post_comment(),则表示发表用户 对某篇文章的评论。每次调用这个函数前,都会先检查用户是否处于登录状态,如果是登录状 态,则允许这项操作;如果没有登录,则不允许。
日志记录
日志记录同样是很常见的一个案例。在实际工作中,如果你怀疑某些函数的耗时过长,导致整 个系统的 latency(延迟)增加,所以想在线上测试某些函数的执行时间,那么,装饰器就是 一种很常用的手段。

4.2 日志记录

日志记录同样是很常见的一个案例。在实际工作中,如果你怀疑某些函数的耗时过长,导致整 个系统的 latency(延迟)增加,所以想在线上测试某些函数的执行时间,那么,装饰器就是 一种很常用的手段。

import time
import functools
def log_execution_time(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        res = func(*args, **kwargs)
        end = time.perf_counter()
        print('{} took {} ms'.format(func.__name__, (end - start) * 1000))
        return res
    return wrapper
@log_execution_time
def calculate_similarity(items):

这里,装饰器 log_execution_time 记录某个函数的运行时间,并返回其执行结果。如果你想 计算任何函数的执行时间,在这个函数上方加上@log_execution_time即可。

4.3 输入合理性检查

在大型公司的机器学习框架中,我们调用机器集群进行模型训练前,往往会用装饰器对其输入 (往往是很长的 JSON 文件)进行合理性检查。这样就可以大大避免,输入不正确对机器造 成的巨大开销。文章来源地址https://www.toymoban.com/news/detail-498793.html

import functools 2
3 def validation_check(input):
4 @functools.wraps(func)
5 def wrapper(*args, **kwargs):
6 ... # 检查输入是否合法
7
8 @validation_check
9 def neural_network_training(param1, param2, ...):

到了这里,关于Python进阶知识(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python】Python函数的黑魔法:递归,嵌套函数与装饰器

    欢迎来到CILMY23的博客 本篇主题为: Python函数的黑魔法:递归,嵌套函数与装饰器 个人主页:CILMY23-CSDN博客 系列专栏:Python | C++ | C语言 | 数据结构与算法 感谢观看,支持的可以给个一键三连,点赞关注+收藏。 写在前头: 本期主要补充上篇未完成的内容,(点击链接

    2024年04月25日
    浏览(31)
  • python第6课(函数,内置高阶函数,匿名函数,装饰器)笔记

    变量名的查找规则; 在访问变量时,先查找本地变量,然后是包裹此函数的外部函数的内部变量,之后是全局变量,最后是内置变量 1 在函数内使用全局变量 2使用nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量 函数名是变量,它在创建函数时绑

    2024年02月11日
    浏览(47)
  • Python 函数(lambda 匿名函数、自定义函数、装饰器)基本使用指南

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段 对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁; 对于不需要多次复用的函数,使用 lambda 表达式可以在用完之后立即释放,提高程序执行的性能。 格式: 一般形式 含 if

    2024年02月08日
    浏览(50)
  • 惬意上手Python —— 装饰器和内置函数

     Python中的装饰器是一种特殊类型的函数,它允许用户在不修改原函数代码的情况下,增加或修改函数的行为。 具体来说, 装饰器的工作原理基于Python的函数也是对象这一事实,可以被赋值给变量、作为参数传递给其他函数或者作为其他函数的返回值。装饰器通常接受一个函

    2024年01月24日
    浏览(46)
  • python中函数,装饰器,迭代器,生成器

    1.函数可以作为参数进行传递 2.函数可以作为返回值进行返回 3.函数名称可以当成变量一样进行赋值操作 作用:在不改变原有函数调用的情况下,给函数增加新的功能          即可以在函数前面增加新的功能,但不改变原来的代码 可迭代的数据类型都会提供迭代器,即可以

    2024年02月07日
    浏览(41)
  • python函数装饰器参数统计调用时间和次数

    python在函数装饰器外层定义一个函数生成封闭作用域来保存装饰器入参,供装饰器使用。 描述 通过类的可调用实例装饰器来统计函数每次调用时间和总调用时间,以及调用次数。 (1) time.perf_counter()获取当前时间,单位秒; (2) 调用函数func前和后的时间差,为func的执行

    2024年02月01日
    浏览(78)
  • Python笔记2(函数参数、面向对象、装饰器、高级函数、捕获异常、dir)

    Python笔记1(赋值、浅拷贝和深拷贝、字符串日期转换、argparse、sys、overwrite、eval、json.dumps/json.loads、os.system(cmd)、zfill、endswith、open) 参数定义 在python中定义函数的时候,函数名后面的括号里就是用来定义参数的,如果有多个参数的话,那么参数之间直接用逗号, 隔开。 定义

    2024年02月08日
    浏览(50)
  • 深入理解Python装饰器:解析高阶函数与代码美学

    当谈到Python编程中的高级特性时,装饰器(decorators)是一个不可忽视的重要概念。装饰器为我们提供了一种优雅的方式来修改或扩展函数的行为,而无需修改其原始代码。在本文中,我们将深入探讨Python装饰器的概念、用法以及实际示例。 在Python中,装饰器是一种特殊类型

    2024年02月12日
    浏览(57)
  • Python 知识体系补全(闭包、装饰器、关键字参数**kwargs,位置参数*args)

    闭包:     什么是闭包,一句话,在函数中再嵌套一个函数,并且引用外部函数的变量,这就是一个闭包了     一般外部函数的返回值为内部函数      def outer(x):          def inner(y):              return x + y         return outer     # 外部函数的返回值,是内部函数     

    2024年02月06日
    浏览(39)
  • < Python全景系列-9 > Python 装饰器:优雅地增强你的函数和类

    欢迎来到我们的系列博客《Python全景系列》第九篇!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语法。无论你是编程新手,还是有一定基础的开发者,这个系列都将提供你需要的知识和技能。 ** 装饰器在

    2024年02月07日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包