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

python装饰器

时间:2023-04-07 22:35:03浏览次数:42  
标签:function 函数 python args kwargs print 装饰 def

参考:https://www.bilibili.com/video/BV1DW4y147Hm/

感觉很久没有学到python的一些新玩法了,参考B站教程

在 Python 中,装饰器(Decorator)是一种用于修改函数或者类的行为的语法结构。
装饰器允许我们在不修改函数定义的情况下,动态地修改函数的行为,从而实现更加灵活和可重用的代码。

装饰器本质上就是一个函数,它接收一个函数作为参数,并返回一个新的函数。在装饰器中,可以对原始函数进行各种操作,并返回修改后的函数。

作为一个函数时

def mydecorator(function): //接收一个函数
    def wrapped(*args, **kwargs): //*args,**kwargs 接收任何参数
        # 在调⽤原始函数之前,做点什么
        print("Welcome")
        result = function(*args, **kwargs) 调用函数
        # 在函数调⽤之后,做点什么,
        # 并返回结果
        return result
    # 返回wrapper作为装饰函数
    return wrapped

@mydecorator
def my_fun(message: str):
    print(f"Hello {message}")


my_fun("li_bai")

但是

print(my_fun.__name__) 
wrapped
此时函数已经失去了原始的名称

此时使用functools内置的wraps()装饰器

from functools import wraps

def mydecorator(function):
    @wraps(function)
    def wrapped(*args, **kwargs):
        # 在调⽤原始函数之前,做点什么
        print("Welcome")
        result = function(*args, **kwargs)
        # 在函数调⽤之后,做点什么
        # 并返回结果
        return result

    # 返回wrapper作为装饰函数
    return wrapped

@mydecorator
def my_fun(message: str):
    print(f"Hello {message}")

print(my_fun.__name__)

当使用的装饰器需要传入参数时

from functools import wraps


def welcome(name):
    def mydecorator(function):
        @wraps(function)
        def wrapped(*args, **kwargs):
            # 在调⽤原始函数之前,做点什么
            print(f"Welcome {name}")
            result = function(*args, **kwargs)
            # 在函数调⽤之后,做点什么,
            # 并返回结果
            return result

        # 返回wrapper作为装饰函数
        return wrapped

    return mydecorator


@welcome("wangwei")
def my_fun(message: str):
    print(f"Hello {message}")


my_fun("lihua")

作为一个类

参考Python高级编程(第2版)

class DecoratorAsClass:
    def __init__(self, function):
        self.function = function

    def __call__(self, *args, **kwargs):
        # 在调⽤原始函数之前,做点什么
        print("Welcome")
        result = self.function(*args, **kwargs)
        # 在调⽤函数之后,做点什么,
        # 并返回结果
        return result


def my_fun(message: str):
    print(f"Hello {message}")


p = DecoratorAsClass(my_fun)

p("喜羊羊")

标签:function,函数,python,args,kwargs,print,装饰,def
From: https://www.cnblogs.com/-Lucky-/p/17297548.html

相关文章

  • Python常见的数据结构
    Python常见的数据结构包括: 列表(List):一种有序的、可变的序列数据结构,可以存储不同类型的元素。支持添加、删除、修改和查询元素等操作。 元组(Tuple):与列表类似,但元组是不可变的,一旦创建就无法修改。元组通常用于表示一个具有一定结构的记录。 集合(Set):一种无序的、不重复的......
  • flask-day5——python项目高并发异步部署、uwsgi启动python的web项目不要使用全局变量
    目录一、python项目高并发异步部署二、uwsgi启动Python的Web项目中不要使用全局变量三、信号3.1flask信号3.2django信号四、微服务的概念五、flask-script六、sqlalchemy快速使用七、sqlalchemy快速使用4.1原生操作的快速使用八、创建操作数据表九、作业1、什么是猴子补丁,有什......
  • python opencv line
    pythonopencvline importcv2#Loadanimageimg=cv2.imread("image1.jpg")#Drawaredlinefrom(0,0)to(100,100)withathicknessof5pixelscv2.line(img,(0,0),(100,100),(0,0,255),5)#Displaytheimagecv2.imshow("Im......
  • python-xpath,爬取猪八戒网(半成品)
    数据未进行清洗xpath  / 层级关系text() 拿文本//    https://blog.csdn.net/KELLENSHAW/article/details/127877476爬取https://task.zbj.com/hall/list-all-0-p1?kw=HTML先定位小盒子的div然后通过检查,xpath://*[@id="hall-list-wrap"]/div[4]/div[1]/div[1]/div[1]/d......
  • 基于Python的机器学习算法——sklearn模块
    基于Python的机器学习算法安装包:pipinstallnumpy#安装numpy包pipinstallsklearn#安装sklearn包importnumpyasnp#加载包numpy,并将包记为np(别名)importsklearn#加载sklearn包python中的基础包:numpy:科学计算的基础库,包括多维数组处理、线性代数等pandas:主......
  • 自动旋转ROS小车(rviz+urdf+xacro)(附加python操作键盘控制小车运动)
    自动旋转ROS小车(rviz+urdf+xacro)(附加python操作键盘控制小车运动)成果图STEP1创建工作空间mkdir-pcar_ws/srccdcar_wscatkin_makeSTEP2在vscode中准备需要的文件夹右键src,点击CreateCatkinPackage再跳出的输入框中:先输入包名:car再输入依赖工具:urdfx......
  • Python 虚拟环境迁移到其他电脑
    Python虚拟环境迁移到其他电脑 一、背景介绍在Python项目开发过程中,根据不同的项目场景,需要切换不同的Python版本。因此,我们经常会对不同的项目,创建特定的Python虚拟环境,实现项目环境间的“物理隔离”。本地创建Python虚拟环境,开发测试完项目功能,需要部署到现场环......
  • #指尖人生#Python常用模块:sys模块
    常用的属性: importsys sys.argv  命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxint 最大的Int值 sys.path  返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.pla......
  • Python数据分析库介绍及引入惯例
    文章和代码等已经归档至【Github仓库:https://github.com/timerring/dive-into-AI】或者公众号【AIShareLab】回复python数据分析也可获取。python的缺点Python有一个叫做全局解释器锁(GlobalInterpreterLock,GIL)的组件,这是一种防止解释器同时执行多条Python字节码指令的机制。这......
  • DolphinDB +Python Airflow 高效实现数据清洗
    DolphinDB作为一款高性能时序数据库,其在实际生产环境中常有数据的清洗、装换以及加载等需求,而对于该如何结构化管理好ETL作业,Airflow提供了一种很好的思路。本篇教程为生产环境中ETL实践需求提供了一个解决方案,将PythonAirflow引入到DolphinDB的高可用集群中,通过使用Ai......