你不一定全知道的四种Python装饰器实现详解!

inline函数和普通函数的区别 inline函数和普通函数有什么区别?要更有深度的回答这个问题,我们先从inline函数的角度来进行剖析,下面先看一个简单的示范代码: #include <iostream> using namespace std; int sum(int x, int y) { return x + y; } int main() { int a = 5; int b = 9; int ... 阅读详情

一、引言

老猿一直想写一篇比较完整的装饰器介绍的博文,从开始写到现在至少过去有半年了,一直都还未写完,因为还有一些知识点没有研究透彻,因此一直在草稿箱放着。在写这个材料的时候,发现Python中的装饰器网上介绍的材料很多,大多数都是介绍的装饰器函数,但也有极少数介绍了装饰器类或用装饰器函数装饰类。老猿想来,装饰器按照装饰器本身和被装饰对象来区分类和函数,应该有4种组合,前面说的有三种,应该还有一种装饰器和被装饰对象都是类的组合。但公开资料中未查到是否可以有类的类装饰器,即装饰器和被装饰对象都是类。老猿参考类的函数装饰器、函数的类装饰器做了很多测试,一度以为没办法实现类的类装饰器,准备放弃,隔了很长一段时间后,最近又花了两天时间进行研究测试,终于弄通了。基于上述研究,老猿决定先单独写一篇关于装饰器四种类型的详细介绍。

装饰器的概念就不介绍了,按照装饰器的类型、被装饰对象的类型,老猿将装饰器分为如下四种:

  1. 函数的函数装饰器:装饰器和被装饰对象都为函数;

  2. 类的函数装饰器:装饰器为函数,被装饰对象为类;

  3. 函数的类装饰器:装饰器为类,被装饰对象为函数;

  4. 类的类装饰器:装饰器和被装饰对象都为类。

二、函数的函数装饰器

装饰器包含装饰对象和被装饰对象,最简单的装饰器是用装饰器函数装饰被装饰函数,在这种场景下,装饰器为函数装饰器,被装饰对象也是函数。

2.1、概述

函数装饰器就是一个特殊的函数,该函数的参数就是一个函数,在装饰器函数内重新定义一个新的函数,并且在其中执行某些功能前后或中间来使用被装饰的函数,最后返回这个新定义的函数。装饰器也可以称为函数的包装器,实际上就是在被装饰的函数执行前或后增加一些单独的逻辑代码,以使得被装饰函数执行后最终的结果受到装饰函数逻辑的影响以改变或限定被装饰函数的执行结果。

2.2、装饰器定义语法

@decoratorName
def originalFunction(*args,**kwargvs):
    函数体

2.3、装饰器语法解释

  1. 参数是一个函数对象;

  2. 封闭函数内部存在一个嵌套函数,该嵌套函数内会调用封闭函数参数指定的函数,并添加额外的其他代码(这些代码就是装饰);

  3. 嵌套函数的参数必须包含originalFunction的参数,但不能带被装饰对象originalFunction;

  4. 嵌套函数返回值必须与封闭函数参数指定函数的返回值类似,二者符合鸭子类型要求(关于鸭子类型请参考《https://blog.youkuaiyun.com/LaoYuanPython/article/details/91350122 第7.3节 Python特色的面向对象设计:协议、多态及鸭子类型》);

  5. 封闭函数的返回值必须是嵌套函数。

  • 装饰器函数的定义参考如下形式:

def decoratorName(originalFunction,*args,**kwargvs):
    def closedFunction(*args,**kwargvs):
        ...  #originalFunction函数执行前的一些装饰代码
        ret = originalFunction(*args,**kwargvs)
        ... #originalFunction函数执行的一些装饰代码
        return ret
    return closedFunction

其中decoratorName是装饰器函数,originalFunction是被装饰的函数,closedFunction是装饰器函数内的嵌套函数。

  • 装饰器定义的语法本质上等同于如下语句: originalFunction = decoratorName(originalFunction)

2.4、多层装饰器的使用

在一个函数外,可以顺序定义多个装饰器,类似如:

@decorator1
@decorator2
@decorator3
def originalFunction(*args,**kwargvs):
    函数体

这种多个装饰器实际上就是叠加作用,且在上面的装饰器是对其下装饰器的包装,以上定义语句效果等同于如下语句:

originalFunction = decorator3(originalFunction)
originalFunction = decorator2(originalFunction)
originalFunction = decorator1(originalFunction)

也即等价于:

originalFunction = decorator1(decorator2(decorator3(originalFunction)))

三、类的函数装饰器

3.1、定义

函数装饰器除了给函数加装饰器(使用函数名作为装饰器函数的参数)外,还可以给类加函数装饰器,给类加函数装饰器时,将类名作为装饰器函数的参数,并在装饰器函数内定义一个类如wrapClass,该类称为包装类,包装类的构造函数中必须调用被装饰类来定义一个实例变量,装饰器函数将返回包装类如wrapClass。

3.2、类的函数装饰器案例1

def decorateFunction(fun, *a, **k):
    class wrapClass():
        def __init__(self, *a, **k):
            self.wrappedClass=fun(*a, **k)
        def fun1(self,*a, **k):
            print("准备调用被装饰类的方法fun1")
            self.wrappedClass.fun1(*a, **k)
            print("调用被装饰类的方法fun1完成")
    return wrapClass

@decorateFunction
class wrappedClass:
    def __init__(self ,*a, **k):
        print("我是被装饰类的构造方法")
        if a:print("构造方法存在位置参数:",a)
        if k:print("构造方法存在关键字参数:",k)
        print("被装饰类构造方法执行完毕")
    def fun1(self,*a, **k):
        print("我是被装饰类的fun1方法")
        if a:print("fun1存在位置参数:",a)
        if k:print("fun1存在关键字参数:",k)
        print("被装饰类fun1方法执行完毕")

    def fun2(self,*a, **k):
        print("我是被装饰类的fun2方法")

针对以上被装饰函数装饰的类wrappedClass,我们执行如下语句:

>>> c1 = wrappedClass('testPara',a=1,b=2)
我是被装饰类的构造方法
构造方法存在位置参数: ('testPara',)
构造方法存在关键字参数: {'a': 1, 'b': 2}
被装饰类构造方法执行完毕
>>> c1.fun1()
准备调用被装饰类的方法fun1
我是被装饰类的fun1方法
被装饰类fun1方法执行完毕
调用被装饰类的方法fun1完成
>>> c1.fun2()
Traceback (most recent call last):
  File "<pyshell#37>", line 1, in <module>
    c1.fun2()
AttributeError: 'wrapClass' object has no attribute 'fun2'
>>>

可以看到被装饰类的相关方法必须在装饰类中调用才能执行,装饰后的类如果装饰函数定义类时未定义被装饰类的同名函数,在装饰后返回的类对象无法执行被装饰类的相关方法。

3.3、类的函数装饰器案例2

上面的案例1是通过将被装饰类的方法在装饰器函数内部的装饰类中静态重新定义方式来实现对被包装类方法的支持,这种情况可以用于装饰器装饰后的类只需调用指定已知方法,但有时我们的装饰器可能用于装饰多个类,只针对构造方法和特定方法在装饰类中重写会导致被装饰类需要调用的功能不能调用,这时我们需要在装饰器中实现一个通用方法来保障被装饰类装饰后能执行被装饰类的所有方法。这就需要借助setattr进行类实例方法的动态定义。

def decorateFunction(fun, *a, **k):
    class wrapClass():
        def __init__(self, *a, **k):
            self.wrappedClass=fun(*a, **k)
            self.decorate() #针对没有重写定义的方法赋值给wrapClass作为实例变量,本案例中为涉及的为fun2方法
        def fun1(self,*a, **k):
            print("准备调用被装饰类的方法fun1")
            self.wrappedClass.fun1(*a, **k)
            print("调用被装饰类的方法fun1完成")
        def decorate(self):#针对没有重写定义的方法赋值给wrapClass作为实例变量
            for m in dir(self.wrappedClass):
                if not m.startswith('_')and m!='fun1':
                    fn = getattr(self.wrappedClass, m)
                    if callable(fn):
                    	 setattr(self, m,fn)
    return wrapClass


@decorateFunction
class wrappedClass:
    def __init__(self ,*a, **k):
        print("我是被装饰类的构造方法")
        self.name = a[0]
        if a:print("构造方法存在位置参数:",a)
        if k:print("构造方法存在关键字参数:",k)
        print("被装饰类构造方法执行完毕")
        
    def fun1(self,*a, **k):
        print("我是被装饰类的fun1方法")
        
        if a:print("fun1存在位置参数:",a)
        if k:print("fun1存在关键字参数:",k)
        print("我的实例名字为:",self.name)
        print("被装饰类fun1方法执行完毕")

    def fun2(self,*a, **k):
        print("我是被装饰类的fun2方法")
        if a:print("fun2方法存在位置参数:",a)
        if k:print("fun2存在关键字参数:",k)
        print("我的实例名字为:",self.name)

针对以上被装饰函数装饰的类wrappedClass,我们执行如下语句:

>>> c1 = wrappedClass('c1',a=1,b=2)
我是被装饰类的构造方法
构造方法存在位置参数: ('c1',)
构造方法存在关键字参数: {'a': 1, 'b': 2}
被装饰类构造方法执行完毕
>>> c2 = wrappedClass('c2',a=12,b=22)
我是被装饰类的构造方法
构造方法存在位置参数: ('c2',)
构造方法存在关键字参数: {'a': 12, 'b': 22}
被装饰类构造方法执行完毕
>>> c1.fun1()
准备调用被装饰类的方法fun1
我是被装饰类的fun1方法
我的实例名字为: c1
被装饰类fun1方法执行完毕
调用被装饰类的方法fun1完成
>>> c2.fun2()
我是被装饰类的fun2方法
我的实例名字为: c2
>>> c1.fun2()
我是被装饰类的fun2方法
我的实例名字为: c1
>>>

可以看到,除了在装饰类中重写的fun1方法可以正常执行外,没有重写的方法fun2也可以正常执行。

四、函数的类装饰器

除了用函数作为装饰器装饰函数或者装饰类之外,也可以使用类作为函数的装饰器。将类作为函数的装饰器时,需将要装饰的函数作为装饰器类的实例成员,由于装饰后,调用相关方法时实际上调用的是装饰类的实例对象本身,为了确保类的实例对象可以调用,需要给类增加__call__方法。

案例:

class decorateClass:
    def __init__(self,fun):
        self.fun=fun

    def __call__(self, *a, **k):
        print("执行被装饰函数")
        return self.fun( *a, **k)

@decorateClass 
def fun( *a, **k):
    print(f"我是函数fun,带参数:",a,k)
    print("老猿Python博客文章目录:https://blog.youkuaiyun.com/LaoYuanPython/article/details/109160152,敬请关注同名微信公众号")

定义后执行相关调用情况如下:

>>> f = fun('funcation1',a=1,b=2)
执行被装饰函数
我是函数fun,带参数: ('funcation1',) {'a': 1, 'b': 2}
老猿Python博客文章目录:https://blog.youkuaiyun.com/LaoYuanPython/article/details/109160152,敬请关注同名微信公众号
>>>

五、类的类装饰器

前面分别介绍了函数的函数装饰器、类的函数装饰器、函数的类装饰器,但公开资料中未查到是否可以有类的类装饰器,即装饰器和被装饰对象都是类。老猿参考类的函数装饰器、函数的类装饰器最终确认类的类装饰器也是可以支持的。

5.1、实现要点

要实现类的类装饰器,按老猿的研究,类的装饰器类的实现需要遵循如下要点:

  1. 装饰器类必须实现至少两个实例方法,包括__init__和__call__;

  2. 在装饰器类的构造方法的参数包括self,wrapedClass,*a,**k,其中wrapedClass代表被装饰类,a代表被装饰类构造方法的位置参数,k代表被装饰类构造方法的关键字参数。关于位置参数和关键字参数请参考《https://blog.youkuaiyun.com/LaoYuanPython/article/details/90668385:第5章函数进阶 第5.1节 Python函数的位置参数、关键字参数精讲》;

  3. 在装饰器类的构造方法中定义一个包装类如叫wrapClass,包装类从装饰器类的构造方法的参数wrapedClass(即被装饰类)继承,包装类wrapClass的构造方法参数为self,*a,**k,相关参数含义同上;

  4. 在包装类的构造方法中调用父类的构造方法,传入参数a、k;

  5. 在装饰器类的构造方法中用实例变量(例如self.wrapedClass)保存wrapClass类;

  6. 在装饰器类的__call__方法中调用self.wrapedClass(*a,**k)创建被装饰类的一个对象,并返回该对象。

按照以上步骤创建的类装饰器,就可以用于装饰其他类。当然上述方法只是老猿自己研究测试的结论,是否还有其他方法老猿也不肯定。

5.2、类的类装饰器案例

class decorateClass: #装饰器类
    def __init__(self,wrapedClass,*a,**k): #wrapedClass代表被装饰类
        print("准备执行装饰类初始化")
        class wrapClass(wrapedClass):
            def __init__(self,*a,**k):
                print(f"初始化被封装类实例开始,位置参数包括:{a}, 关键字参数为{k}")
                super().__init__(*a,**k)
                print(f"初始化被封装类实例结束")
        self.wrapedClass=wrapClass
        print("装饰类初始化完成")

    def __call__(self, *a, **k):
        print("被装饰类对象初始化开始")
        wrapedClassObj = self.wrapedClass(*a,**k)
        print("被装饰类对象初始化结束")
        return wrapedClassObj

@decorateClass
class car:
    def __init__(self,type,weight,cost):
        print("class car __init__ start...")
        self.type = type
        self.weight = weight
        self.cost = cost
        self.distance = 0
        print("class car __init__ end.")

    def driver(self,distance):
        self.distance += distance
        print(f"{self.type}已经累计行驶了{self.distance}公里")
        print("老猿Python博客文章目录:https://blog.youkuaiyun.com/LaoYuanPython/article/details/109160152,敬请关注同名微信公众号")

c = car('爱丽舍','1.2吨',8)
c.driver(10)
c.driver(110)

执行以上代码,输出如下:

准备执行装饰类初始化
装饰类初始化完成
被装饰类对象初始化开始
初始化被封装类实例开始,位置参数包括:('爱丽舍', '1.2吨', 8), 关键字参数为{}
class car __init__ start...
class car __init__ end.
初始化被封装类实例结束
被装饰类对象初始化结束
爱丽舍已经累计行驶了10公里
爱丽舍已经累计行驶了120公里
老猿Python博客文章目录:https://blog.youkuaiyun.com/LaoYuanPython/article/details/109160152,敬请关注同名微信公众号

除了上述方法,老猿又找到了一种更简单的方法,具体请参考《https://blog.youkuaiyun.com/LaoYuanPython/article/details/111307103:类的类装饰器实现思路及案例》。

六、小结

本文详细介绍了Python中的四类装饰器,这四类装饰器根据装饰器和被装饰对象的类型分为函数的函数装饰器、类的函数装饰器、函数的类装饰器、类的类装饰器,文中详细介绍了四类装饰器的实现步骤,并提供了对应的实现案例,相关介绍有助于大家全面及详细地理解Python的装饰器。

后记

近期有很多朋友通过私信咨询有关Python学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地

 

【Python】exec使用时的一些注意事项 【未经本人同意不得私自转载】 【本文发布于优快云,地址为:https://blog.csdn.net/weixin_44733774/article/details/124692142】 书承上文globals和locals的一些细节向问题,不过本篇内容和globals()、locals()的关联性不是很强。 博客中出现的代码传到gayhub中:https://github.com/Ls-Jan/Python_LanguageFeatures/tree/main/exec 二、exec() 学 阅读详情

相关推荐

C++之inline函数使用总结

一、C++为什么引入inline函数? 主要目的:用它代替C语言中表达式形式的宏定义来解决程序中函数调用的效率问题。 C语言中的宏定义,它使用预处理器实现,没有了参数压栈、代码生成等一系列得到操作,因此效率很高。 但缺点如下: 预处理器符号表中的简单替换,不能进行参数有效性的检测,不能享受C++编译器严格类型检查的好处。 另外,它的返回值也不能被强制转换为可转换的合适类型。 C++如果

码莎拉蒂 4295

内联函数和普通函数的区别

1. 内联函数和普通函数的参数传递机制相同,但是编译器会在每处调用内联函数的地方将内联函数内容展开,这样既避免了函数调用的开销又没有宏机制的缺陷 2. 普通函数在被调用的时候,系统首先要到函数的入口地址去执行函数体,执行完成之后再回到函数调用的地方继续执行,函数始终只有一个复制。     内联函数不需要寻址,当执行到内联函数的时候,将此函数展开,如果程序中有N次调用了内联函数则会有N次展开函数...

weixin_41786584的博客 1万+

护网日志分析基础

简要介绍日志分析,给出日志分析的步骤和思路。要求根据日志中的字符串特征,识别攻击者的攻击工具;根据日志中的行为特征,确定攻击者可能的攻击手段等。总结归纳护网中常见的中间件Tomcat、Apache、Weblogic、Nginx、Apache、IIS、MySQL、SQL Server、Oracle的日志路径和日志配置文件路径等。

m0_59302403的博客 3695

inline内联函数及其与一般函数的区别

C++基础,内联函数的使用,内联函数与一般函数的区别

taoshisan的博客 562

【技术拆解】Illumina边合成边测序(SBS)核心流程全解析 | 从文库构建到数据分析

本文深入解析了Illumina边合成边测序(SBS)技术的完整流程。从DNA样本的文库构建(片段化、加接头、扩增),到Flowcell上的簇生成(桥式PCR),再到核心的边合成边测序(SBS)循环(荧光标记、可逆终止),最后简述了从原始数据到生物学洞见的数据分析步骤,为理解这一主流高通量测序技术提供了清晰的框架。

weixin_29201859的博客 535

医疗影像分析实战:肺炎X光片分类与分割

医疗影像分析实战:肺炎X光片分类与分割 ,人工智能,计算机视觉,大模型,AI,在医疗领域,医疗影像分析技术凭借其高效、精准的特点,成为疾病诊断与治疗的重要辅助手段。肺炎作为一种常见的呼吸道疾病,严重威胁人类健康,通过 X 光片对肺炎进行诊断是临床常用方法。利用计算机技术实现肺炎 X 光片的自动分类与分割,不仅能减轻医生的工作负担,还能提高诊断的准确性和效率。本文将深入讲解肺炎 X 光片分类与分割的实战过程,结合大量代码示例和关键概念解析,帮助读者掌握相关技术。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 3万+

python 函数修饰器 父类_你不一定全知道的四种Python装饰器实现详解!

原标题:你不一定全知道的四种Python装饰器实现详解!一、引言老猿一直想写一篇比较完整的装饰器介绍的博文,从开始写到现在至少过去有半年了,一直都还未写完,因为还有一些知识点没有研究透彻,因此一直在草稿箱放着。在写这个材料的时候,发现Python中的装饰器网上介绍的材料很多,大多数都是介绍的装饰器函数,但也有极少数介绍了装饰器类或用装饰器函数装饰类。老猿想来,装饰器按照装饰器本身和被装饰对象来区分...

weixin_35720393的博客 392

Oracle数据库表空间使用情况查询

在Oracle数据库中,表空间(Tablespace)是用于存储表、索引和其他数据库对象的逻辑存储单元。了解表空间的使用情况对于数据库管理员和开发人员来说是非常重要的,因为它可以帮助他们监控数据库的空间使用情况并进行容量规划。本文将介绍如何查询Oracle数据库中的表空间使用情况。通过执行以上SQL查询语句,你可以获得Oracle数据库中表空间的使用情况、文件大小和表空间大小等信息。这些信息可以帮助你了解数据库的存储情况,并进行适当的优化和容量规划。查看表空间的数据文件和表空间大小。查看表空间的使用情况。

CsmbPascal的博客 857

你不一定全知道的四种Python装饰器实现详解

本文详细介绍了Python中的四类装饰器,这四类装饰器根据装饰器和被装饰对象的类型分为函数的函数装饰器、类的函数装饰器、函数的类装饰器、类的类装饰器,文中详细介绍了四类装饰器的实现步骤,并提供了对应的实现案例,相关介绍有助于大家全面及详细地理解Python的装饰器。

老猿Python 1万+

Windows 下 OpenClaw(小龙虾) 安装全记录:从零到一的保姆级图文教程(持续更新中)

本文主要介绍了Windows 下 OpenClaw 安装全记录:从零到一的保姆级图文教程,希望能对学习使用OpenClaw 的同学们有所帮助。 文章目录 1. 背景 2. 实战教程 2.1 步骤一 安装Node.js 2.2 步骤二:安装并配置OpenClaw 2.3 步骤三:配置模型 2.4 步骤四:对话 3. 后续使用步骤

weixin_43178406的博客 16万+

联想开天N70z/N79Z G1d笔记本Win驱动下载

本文介绍了联想开天N70Z/N79Z G1d笔记本在Win11系统下的驱动安装方法。提供了WiFi网卡驱动(RealtekWlan)和显卡驱动(ZX C960 GPU)的详细安装步骤,包括手动更新驱动和卸载流程。驱动安装后成功支持5G WiFi连接并正确识别显卡型号。文中附有系统信息和安装效果截图,同时提供了官方驱动下载地址及备用下载链接。该指南适用于需要为联想开天N70Z/N79Z G1d笔记本安装Win11驱动的用户参考。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 3873

你不一定全知道的四种Python装饰器实现详解_python 装饰器 再内存中的实现方法

print(“老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/109160152,敬请关注同名微信公众号”)Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。我是函数fun,带参数: (‘funcation1’,) {‘a’: 1, ‘b’: 2}构造方法存在关键字参数: {‘a’: 1, ‘b’: 2}

weixin_57992300的博客 775

MicroPython学习:在STM32上进行移植

本文将介绍如何在STM32上移植MicroPython,并提供相应的源代码。通过以上步骤,你已经成功地将MicroPython移植到STM32上,并可以使用MicroPython语言编写和运行代码。你可以进一步探索MicroPython的功能和API,以利用STM32的各种外设和功能。使用STM32CubeProgrammer或其他适当的烧录工具,将编译生成的MicroPython固件烧录到STM32微控制器中。打开该文件,并根据你的STM32微控制器类型进行必要的配置更改。模块来控制STM32的LED。

JeeVue的博客 1237

python装饰器详解

python装饰器

weixin_44992737的博客 8万+

C语言设计模式全面解析:从理论到28个实战示例

本文系统介绍了23种经典设计模式在C语言中的实现方法。通过结构体、函数指针等技巧,C语言可以优雅地模拟面向对象特性,实现代码复用与解耦。文章分类详解了创建型、结构型、行为型三大类模式,并提供了28个完整代码示例,包括单例、策略、观察者等核心模式的精简实现。这些模式在嵌入式系统、操作系统内核等场景中广泛应用,如状态机、事件驱动等。学习C语言设计模式的关键在于理解模式意图,掌握函数指针和结构体组合等技巧,并在实际项目中灵活运用。本文为C语言开发者提供了全面的设计模式参考指南。

数字人生 363

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

你不一定全知道的四种Python装饰器实现详解_python 装饰器 再内存中的实现方法(1)

函数装饰器就是一个特殊的函数,该函数的参数就是一个函数,在装饰器函数内重新定义一个新的函数,并且在其中执行某些功能前后或中间来使用被装饰的函数,最后返回这个新定义的函数。装饰器也可以称为函数的包装器,实际上就是在被装饰的函数执行前或后增加一些单独的逻辑代码,以使得被装饰函数执行后最终的结果受到装饰函数逻辑的影响以改变或限定被装饰函数的执行结果。函数体。

2401_84563254的博客 790

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Python装饰器四种实现方式

函数装饰器就是一个特殊的函数,该函数的参数就是一个函数,在装饰器函数内重新定义一个新的函数,并且在其中执行某些功能前后或中间来使用被装饰的函数,最后返回这个新定义的函数。装饰器也可以称为函数的包装器,实际上就是在被装饰的函数执行前或后增加一些单独的逻辑代码,以使得被装饰函数执行后最终的结果受到装饰函数逻辑的影响以改变或限定被装饰函数的执行结果。@decoratorName def originalFunction( * args , ** kwargvs) : 函数体。

Python热爱者的博客 1900

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Python装饰器详解

详细介绍了Python装饰器语法的有关内容与使用技巧,希望对大家有所帮助。

千山暮彩 1万+

python中装饰器详解

装饰器 我们知道,在python中,我们可以像使用变量一样使用函,这主要依赖于以下几点: 函数可以被赋值给其他变量 函数可以被删除 可以在函数里面再定义函数,函数嵌套。 函数可以作为参数传递给另外一个函数 函数可以作为另一个函数的返回值 对一个简单的函数进行装饰 为了更好的理解装饰器,我们先从一个简单的例子开始,假设有下面这个函数: def hello(): return...

AFeng521web 7939

python 四种装饰器

一、装饰器的定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。python中的装饰器可以用函数实现,还可以用类实现。 二、四种装饰器 1、# 不带参数装饰器 def wrapper(func): print(func) def new_func(*new_argument): print('before') resul...

yangxiaoyan12的博客 750

Python装饰器的实现和万能装饰器

Python装饰器的实现和万能装饰器 在Python中,装饰器是在不改变已有函数的代码的前提下,给函数增加新的功能的一种函数。 装饰器接收一个函数作为参数,返回值也是一个函数。 在Python中,实现装饰器的方式叫做闭包。 一、闭包的实现 闭包是指函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。 闭包的使用,可以隐藏内部函数的工作细节,只给外部...

weixin_43790276的博客 5987

python装饰器详解!

Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里。

Python_trys的博客 937
上一篇: Python写图片格式批量处理工具!你还一张一张转格式吗?
下一篇: 让Python在后台自动解压各种压缩文件!自动化就是好!
pythonlaodi
博客等级 码龄6年 286粉丝 244原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值