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

☞ ░ 前往老猿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
### C++ 中装饰器模式的实现与用法 #### 1. 装饰器模式的概念 装饰器模式是一种结构型设计模式,允许动态地给某个对象添加一些额外的功能,而不需要修改其原有代码。这种模式通过创建一个包装对象来包裹真实的对象,在不改变原对象的基础上增加新的行为。 #### 2. I/O 流作为装饰器模式的应用实例 C++ 标准库中的 `std::iostream` 是装饰器模式的一个经典应用场景[^1]。这些流可以被看作是一系列可选特性的集合体,比如文件读写、字符串处理以及网络通信等。每一个特性都可以独立存在或者与其他特性组合起来形成更复杂的行为。例如: - 基础流提供了基本的数据传输能力; - 缓冲机制则是在基础之上增加了数据暂存的能力; - 格式化控制进一步增强了输出内容的表现形式; 每层装饰都只负责自己特定的任务,并且能够透明地传递请求到下一层直到最终的目标对象完成实际操作。 #### 3. 具体案例分析——文本加粗显示 另一个例子展示了如何利用装饰器模式为纯文本加上 HTML 加粗标签。这里定义了一个名为 `BoldText` 的具体装饰者,它继承自通用的文字修饰基 `TextDecorator` 并重写了获取文本的方法 `getText()` 。当调用此方法时,会在原始文字前后分别附加 `<b>` 和 `</b>` 这样的标记符从而达到视觉上的强化效果[^4]。 ```cpp class Text { public: virtual std::string getText() const = 0; }; class PlainText : public Text { private: std::string content_; public: explicit PlainText(const std::string& text):content_(text){} std::string getText() const override{ return content_; } }; // 抽象装饰者 class TextDecorator : public Text { protected: Text* decorated_text_; public: explicit TextDecorator(Text *text) :decorated_text_(text){} ~TextDecorator(){ delete decorated_text_; } std::string getText() const override=0; }; // 具体装饰者A - BoldText class BoldText : public TextDecorator { public: using TextDecorator::TextDecorator; std::string getText() const override { return "<b>" + this->decorated_text_->getText() + "</b>"; } }; ``` 上述代码片段展示了一种简单的基于面向对象编程原则构建出来的装饰器架构。其中包含了三个主要部分:接口(或抽象父)、组件实体及其对应的多个不同型的增强版本即所谓的“装饰”。 #### 4. 控制的设计思路 除了直接作用于业务逻辑之外,还可以看到某些情况下装饰器本身也会参与到系统的其他方面当中去,如管理界面控件的状态变化或是响应用户的交互动作等等。此时可能会涉及到既有的继承体系内部再引入一个新的层次用于承载这部分职责的情况。这便是为什么有时候会观察到像 Decorator 和 Control 同时存在于同一个里面的现象[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值