☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░
一、引言
在《https://blog.csdn.net/LaoYuanPython/article/details/111303395:你不一定全知道的四种Python装饰器实现详解 》介绍了Python装饰器的四种类型:函数的函数装饰器、类的函数装饰器、函数的类装饰器、类的类装饰器,并针对网上没有公开资料的类的类装饰器给出了实现方法。昨晚仔细想了一下,应该还有一种其他实现方法,早上一测试发现确实可以,并且方案比上文的方案更简单,因此在此单独介绍一下。
二、实现思路
这个方法的实现需要遵循如下要点:
- 装饰器类必须实现至少两个实例方法,包括
__init__和__call__
; - 在装饰器类的构造方法的参数包括
self,wrapedClass,*a,**k
,其中wrapedClass代表被装饰类,a代表被装饰类构造方法的位置参数,k代表被装饰类构造方法的关键字参数; - 在装饰器类的构造方法中用实例变量(例如self.wrapedClass)保存wrapedClass类;
- 在装饰器类的
__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,敬请关注同名微信公众号
四、小结
本文介绍了类的类装饰器的另一种简单实现思路,其实无论是本文的实现思路还是上面引文的实现思路,案例都只能保障类对象的创建被装饰,如果需要对类的方法进行装饰,还需要单独的处理,我们将在后面的文章中进一步介绍。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
关于老猿的付费专栏
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
- 付费专栏《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。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。