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

python-装饰器

时间:2024-05-27 15:11:51浏览次数:60  
标签:return python def func print 装饰 decorator

装饰器

基本样式

def decorator(func):
    def wrapper(*args, **kwargs):
        print("before")
        res = func(*args, **kwargs)
        print("after")
        return res
    return wrapper


@decorator
def func():
    print("hello")

func()

装饰器传参1

def decorator_factory(name):
    """装饰器工厂"""
    def decorator(func):
        def wrapper(*args, **kwargs):
            print("before")
            res = func(*args, **kwargs)
            print("after")
            return res
        return wrapper
    # 这样就可以获取到name的值
    print(name)
    return decorator



@decorator_factory(name="随便的参数")
def func():
    print("hello")

func()

装饰器传参2

获取被装饰函数的参数
from functools import wraps
def decorator_factory(name):
    """装饰器工厂"""

    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            print("before")
            res = func(*args, **kwargs)
            # 这样就可以获取到args的值,下面两种方式都可以获取到
            print(a)
            print(b)
            print(args[0])
            print(args[1])
            print("after")
            return res
        return wrapper
    # 这样就可以获取到name的值
    print(name)
    return decorator



@decorator_factory(name="随便的参数")
def func(a, b):
    print("hello")
    return a + b
a = 1
b = 2
func(a, b)

@wraps用法

@wraps 装饰器的主要作用是将被装饰函数的元信息复制到装饰器函数中。这些元信息包括函数的名称、文档字符串、参数列表等。通过使用 @wraps 装饰器,可以确保装饰器函数不会改变被装饰函数的这些重要信息。

具体来说,当你使用 @wraps 装饰器装饰一个装饰器函数时,它会将被装饰函数的元信息复制到装饰器函数中。这样做的好处是,当你访问装饰器函数的属性时,你会得到和原始被装饰函数相同的结果。如果不使用 @wraps 装饰器,装饰器函数的属性可能不会和被装饰函数相匹配,这会导致一些意想不到的问题。

因此,使用 @wraps 装饰器是一个很好的习惯,特别是在编写装饰器时,这可以确保装饰的透明性和一致性。

测验:

# 编写一个装饰器,在函数执行前打印当前时间。
import time
def time_decorator(func):
    def wrapper(*args,**kargs):
        print(f"现在的时间是:{time.ctime()}")
        return func(*args,**kargs)
    return wrapper

@time_decorator
def function1():
    print("hello world")

function1()

# 编写一个装饰器,在函数执行后打印函数的返回值。
def after_decorator(func):
    def wrapper(*args,**kargs):
        res = func(*args,**kargs)
        print(f"函数的返回值是:{res}")
        return res
    return wrapper
@after_decorator
def function2(a,b):
    return a + b
function2(1,2)

# 编写一个装饰器,用于记录函数被调用的次数。
def count_decorator(func):
    count = 0
    def wrapper(*args,**kargs):
        nonlocal count # 声明为全局变量
        count += 1
        print(f"函数被调用了{count}次")
        return func(*args,**kargs)

    return wrapper
@count_decorator
def function3():
    print("hello world")

function3()
function3()

# 编写一个装饰器,用于限制函数的执行次数,达到限制次数后无法再次执行。
def warning_decorator(count):
    def decorator(func):
        def wrapper(*args, **kwargs):
            wrapper.count += 1
            if wrapper.count <= count:
                return func(*args, **kwargs)
            else:
                print("函数执行次数已达上限")
        wrapper.count = 0
        return wrapper
    return decorator

@warning_decorator(3)  # 设置上限为3次
def function4():
    print("hello world")

function4()  # 第一次调用
function4()  # 第二次调用
function4()  # 第三次调用
function4()  # 第四次调用,达到上限

标签:return,python,def,func,print,装饰,decorator
From: https://www.cnblogs.com/shenbojun/p/18215549

相关文章

  • python模块之smtplib邮件处理模块
    要求:发送一封简单的邮件发送html格式的邮件在邮件中带图片发送邮件步骤:1.登录邮件服务器2.构造符合邮件协议规则的邮件内容3.发送python对SMTP支持有smtplib和email模块,email负责构造邮件,smtplib负责发送邮件importsmtplibfromemail.mime.textimportMIMETextf......
  • Python闭包和装饰器原理
    #Python闭包和装饰器#############闭包##############'''1.一个外层函数,内嵌一个内层函数;2.内层函数使用外层函数的参数;3.外层函数将内层函数作为返回值返回'''#外层函数defouter(msg):#内层函数definner():#内层函数使用外......
  • Python编程入门:从零开始掌握基础
    Python编程入门:从零开始掌握基础Python是一门简单易学但功能强大的编程语言。它广泛应用于数据科学、机器学习、web开发、自动化任务等领域。本系列文章将带你从零开始学习Python,逐步掌握这门语言的基础知识。本文是系列的第一篇,涵盖Python的基本语法、变量和数据类型等内......
  • Python基础-容器数据
    一、容器类型介绍容器就是存放数据的python中的容器数据有多种形式,每种形式有自己的存储格式,数据存储特性不一样字符串str就是容器存放一个一个字母格式:单引号'数据',双引号"数据",三个引号"""数据"""列表list格式:[数据1,数据2,数据3.....]元祖tuple......
  • Python 问题汇总
    一.Python环境问题使用pytest在terminal中执行脚本调用python3.9,而使用pycharm的virtualenv执行脚本调用的是python3.10,由于环境不一致,因此进行配置;1.安装pyenv进行版本管理,当前安装的是python3.9.19,目录为: /usr/local/Cellar/[email protected]/3.9.19创建软链:ln-s......
  • 基于Python LSTM的多维数据预测
    欢迎大家点赞、收藏、关注、评论啦,由于篇幅有限,只展示了部分核心代码。文章目录一项目简介二、功能三、系统四.总结一项目简介  一、项目背景与意义在现实世界的数据分析中,我们经常需要处理多维数据(multi-variatedata),这些数据往往具有复杂的时空关系和时......
  • 深度学习之基于Python+OpenCV+Tensorflow+Keras实时口罩检测系统
    欢迎大家点赞、收藏、关注、评论啦,由于篇幅有限,只展示了部分核心代码。文章目录一项目简介二、功能三、系统四.总结一项目简介  一、项目背景与意义在全球公共卫生背景下,口罩成为了重要的防护工具。特别是在疫情流行期间,确保公共场所的人们佩戴口罩对于防......
  • Python网页解析
    课前案例如果不存在imgs目录,则需要手动创建它,或者通过代码创建。可以使用 Path.mkdir() 方法创建目录。例如:imgs_dir=Path("imgs")imgs_dir.mkdir(parents=True,exist_ok=True)记得下载lxml软件包,可以在终端用指令下载:pipinstall-ihttps://mirrors.aliyun.com/p......
  • RabbitMQ(python)
     一、认识MQMQ全称为MessageQueue消息队列(MQ)是一种应用程序对应用程序的通信方法。MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息。这样发布者和使用者都不用知道对方的存在。生产者消费者模式是通过一个容器来解决生......
  • Python基于微信小程序的农产品溯源平台论文(1)
    目录1绪论41.1项目研究的背景41.2开发意义41.3项目研究内容与结构42开发技术介绍52.1B/S架构52.2小程序平台52.3python语言简介52.4MySQL介绍62.5MySQL环境配置82.6Django框架83系统分析93.1可行性分析93.1.1技术可行性93.1.2经济可行性......