当前位置: 首页 > news >正文

类的类装饰器简单实现思路及案例

☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░

一、引言

在《https://blog.csdn.net/LaoYuanPython/article/details/111303395:你不一定全知道的四种Python装饰器实现详解 》介绍了Python装饰器的四种类型:函数的函数装饰器、类的函数装饰器、函数的类装饰器、类的类装饰器,并针对网上没有公开资料的类的类装饰器给出了实现方法。昨晚仔细想了一下,应该还有一种其他实现方法,早上一测试发现确实可以,并且方案比上文的方案更简单,因此在此单独介绍一下。

二、实现思路

这个方法的实现需要遵循如下要点:

  1. 装饰器类必须实现至少两个实例方法,包括__init__和__call__
  2. 在装饰器类的构造方法的参数包括self,wrapedClass,*a,**k,其中wrapedClass代表被装饰类,a代表被装饰类构造方法的位置参数,k代表被装饰类构造方法的关键字参数;
  3. 在装饰器类的构造方法中用实例变量(例如self.wrapedClass)保存wrapedClass类;
  4. 在装饰器类的__call__方法中调用self.wrapedClass(*a,**k)创建被装饰类的一个对象,并返回该对象。

按照以上步骤创建的类装饰器,就可以用于装饰其他类。

三、案例

案例还是上文类似的案例,只是换成了本文的实现方法:

class decorateClass:
    def __init__(self,wrapedClass,*a,**k):
        print("准备执行被装饰类初始化")
        self.wrapedClass=wrapedClass
        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.csdn.net/LaoYuanPython/article/details/109160152,敬请关注同名微信公众号")
c = car('爱丽舍','1.2吨',8)
c.driver(10)
c.driver(110)

执行结果:

准备执行被装饰类初始化
被装饰类初始化完成
被装饰类对象初始化开始
class car __init__ start...
class car __init__ end.
被装饰类对象初始化结束
爱丽舍已经累计行驶了10公里
老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/109160152,敬请关注同名微信公众号
爱丽舍已经累计行驶了120公里
老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/109160152,敬请关注同名微信公众号

四、小结

本文介绍了类的类装饰器的另一种简单实现思路,其实无论是本文的实现思路还是上面引文的实现思路,案例都只能保障类对象的创建被装饰,如果需要对类的方法进行装饰,还需要单独的处理,我们将在后面的文章中进一步介绍。

写博不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

关于老猿的付费专栏

  1. 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░

相关文章:

  • OpenCV-Python图形图像处理:自用的一些工具函数源代码
  • OpenCV-Python图形图像处理:自用的一些工具函数功能及调用语法介绍
  • OpenCV-Python图形图像处理:split通道拆分和数组矩阵访问通道
  • Python图像处理:OpenCV HSV和标准表示法的区别以及转换
  • OpenCV-Python图像处理:用inRange刷选图像中指定颜色对象案例
  • PyQt事件信号实战:为QTableWidget提供键盘事件
  • OpenCV-Python图像处理:区分前景背景权重的图像融合案例
  • 2020年总结:平安辞旧岁,老牛自奋蹄!
  • OpenCV-Python图像处理:插值方法及使用resize函数进行图像缩放
  • Python3装饰器的隐秘角落
  • 一种利用Python库解决视频课程检测窗口是否活动的简单方法
  • 人工智能数学基础6:极限、极限运算、ε-δ语言、ε-N语言、级数和函数连续性
  • 人工智能数学基础专栏目录
  • 人工智能数学基础8:两个重要极限及夹逼定理
  • 人工智能数学基础9:集合相关概念
  • 4. 路由到控制器 - Laravel从零开始教程
  • C++类的相互关联
  • DataBase in Android
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • E-HPC支持多队列管理和自动伸缩
  • Java|序列化异常StreamCorruptedException的解决方法
  • node 版本过低
  • Octave 入门
  • PHP面试之三:MySQL数据库
  • Python_OOP
  • React Native移动开发实战-3-实现页面间的数据传递
  • Redis字符串类型内部编码剖析
  • Redux系列x:源码分析
  • supervisor 永不挂掉的进程 安装以及使用
  • Vue.js-Day01
  • 分布式事物理论与实践
  • 力扣(LeetCode)21
  • 新书推荐|Windows黑客编程技术详解
  • 应用生命周期终极 DevOps 工具包
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 仓管云——企业云erp功能有哪些?
  • !!java web学习笔记(一到五)
  • # 数据结构
  • #git 撤消对文件的更改
  • (4.10~4.16)
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (强烈推荐)移动端音视频从零到上手(上)
  • (转)scrum常见工具列表
  • (转)winform之ListView
  • (转)可以带来幸福的一本书
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .Net6使用WebSocket与前端进行通信