Python装饰器实例讲解(二)
1|0Python装饰器实例讲解(二)
你最好去看下第一篇,虽然也不是紧密的链接在一起
参考B站码农高天的视频,大家喜欢看视频可以跳转忽略本文:https://www.bilibili.com/video/BV19U4y1d79C
一键三连哦
本文的知识点主要是 类装饰器
装饰器的本质(up主说的万能公式)
1|1案例
-
代码
-
改造为类装饰器(注意对比)
- 你得知道基础的python的面向对象的知识
- 一些类的魔术方法如__init__和__call__
-
完整的代码
1|2码农高天说
我把up主的一些话摘录一些写到这里,辅助大家理解
- 装饰器decorator:是一个输入是函数,输出也是函数的函数(看讲解一中的装饰器)
- 类装饰器 class decorator,up主说有一定的歧义
- 可以当做装饰器的类(装饰器本身)
- 可以装饰类的装饰器(装饰器要装饰的对象)
- 装饰器本身既可以是函数也可以是类,装饰的对象同样可以是函数或者类
- 背这些理论没有意义,关键要弄懂背后的原理
- __call__可以让类的实例当做函数用(就是callable)
1|3万能公式
-
装饰器语法糖背后
-
@CountTime等价于,所谓的万能公式咯
-
print(add(1,2))已经不再是使用的原始的add了,用的是新的add
-
也就是说
-
你还可以这样
-
是的,被装饰过的函数已经不再是原来的函数了,它总是会先去执行装饰器(CountTime(add))
-
总结:
- 在一个函数上做装饰器,等价于装饰器调用这个函数
- 在类装饰器的这个例子中,add从一个函数变成了一个类的实例(type看下即可)
1|4改造,有参数的装饰器
-
我们看到过很多的装饰是有参数的,这是怎么实现的呢?
-
比如你想要输出的信息可以调整其前缀
-
你希望是这样装饰和调用的
-
那咋实现呢?
-
回到万能公式:
-
CountTime这个类能CountTime(prefix='用时:'),就是实例化做到的,所以...类的init方法要改一下,不再是传参function_name了,而是传你的prefix,像这样
-
但现在还不能继续,add = CountTime(prefix='用时:')(add)中你(add)还要处理,前面是init做的,()就是callable做的,里面的参数是add,也就是函数的名字,所以你的call也要改造,像这样吗?
-
不对的,光这样改造不够的,因为你这个function_name(*args,**kwargs)在IDE中就会报错,哪里来的呢?没有定义。
-
回想讲解一中,函数装饰器里层,还有一个函数,此处就可以参考
前面谈的是类是一个装饰器,装了一个函数
下面谈的是函数是一个装饰器,装饰一个类
1|5类的装饰器
-
现在有这么一个类
-
你学过python可以这样修改
-
但如果有很多的类都要如此呢?
-
可以写个装饰器,来装饰这些类呗
-
怎么写?回想刚才你学到的知识,万能公式!
-
你现在要写一个函数,名字随意,如show_classname
-
你肯定要装饰在类上
-
根据万能公式,你的Person应该变了
-
对于使用者而言,应该没有任何操作上的差异
-
分析完了,函数体部分是有点不好理解的
-
看着这个结果,我们来解释下(也许你会更好理解)
-
如果还不明白...尽力了
-
1|6带参数的类的装饰器
码农高天并没有给出示例代码
当然如果你真懂了前面的"改造,有参数的装饰器",也很简单
-
直接上代码
-
默认值就是='类名:',怎么用呢
-
注意不能这样
-
提示错误
-
提个问题,为何会报错?
-
如果你无法解释的通,你应该还没理解。
-
答案其实还是万能公式。
-
如果还不明白...尽力了
__EOF__

本文链接:https://www.cnblogs.com/wuxianfeng023/p/17106513.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)