采用__call__ 实现装饰器模式
2024-09-19 21:47:51
装饰器模式在实现中也是很常见的:比如手机贴膜,手机壳 都是为了给手机增加一些额外功能 增加耐操
装饰器模式的本质就是对对象二次包装,赋额外功能
__call__
__call__是python魔术方法——可调用对象,指的是可以实现一个对象实例以函数的方式来调用。
class Test:
def __call__(self, *args, **kws):
print(*args, **kws) t = Test() t("你好","hello word")
无参数装饰器
现在有一个out函数,用于打印输出。现在要想要统计这函数执行了多少次
class Count:
def __init__(self,func):
self.func = func
self.i = 0 def __call__(self,*args,**kws):
self.i += 1
print(f"执行次数:{self.i}")
return self.func(*args,**kws) @Count
def out(s):
print(s) out("你好")
out("呵呵") '''
相当于
out = Count(out)
out()
把函数传入Count类中,创建对象实例 然后利用__call__魔术方法实现执行可调用对象
'''
有参数装饰器
现在Count类有一个属性color,给统计数值上颜色。
class Count:
def __init__(self, color):
self.color = color
self.i = 0 def __call__(self, func):
self.func = func
return self.__callback def __callback(self, *args, **kw):
self.i += 1
print(f"执行次数:{self.color} {self.i}")
return self.func(*args, **kw) @Count("红色") # 接收参数
def test(s):
print(s) test("哈哈") '''
等价于
d = Count("红色")
test = d(test)
test("哈哈")
'''
test("哈哈")
test("哈哈") ''' 输出
执行次数:红色 1
哈哈
执行次数:红色 2
哈哈
执行次数:红色 3
哈哈
'''
最新文章
- s3c2440液晶屏驱动 (内核自带) linux-4.1.24
- 【python】pickle模块
- linux下history命令显示历史指令记录的使用方法
- 一个简单的web服务器
- Yii框架,在页面输出执行sql语句,方便调试
- js继承关系
- -_-#【Dom Ready / Dom Load】
- HTML5事件——contextmenu 隐藏鼠标右键菜单
- ajax + php + Controller 控制所有后台函数调用
- Oracle Database 12c Release 1 Installation On Oracle Linux 6.4 x86_64
- From Ontology to Semantic Web
- java 课程设计 购物车系统 个人
- Dynamics CRM 2011/2013 section的隐藏
- vscode git
- redis5.0.4 集群搭建
- k64 datasheet学习笔记1---概述
- UWP开发细节记录:WRL::ComPtr 的坑
- MyBatis实战之解析与运行
- Applying the Kappa architecture in the telco industry
- 20145331魏澍琛《网络对抗》Exp2 后门原理与实践
热门文章
- CentOS7安装及配置vsftpd (FTP服务器FTP账号创建以及权限设置)
- 微信小程序图片宽度100%,高度自适应
- RunTime.getRunTime().addShutdownHook的用法
- ContentProvider数据库共享之——实例讲解
- Error-ASP.NET:未能加载文件或程序集“CMSCalendar”或它的某一个依赖项。系统找不到指定的文件。
- Oracle系列十三 视图
- Django入门2开发工具pycharm的配置
- (mysql)找不到请求的.Net Framework Data Provider。可能没有安装
- 使用 atom 将 makedown 编辑并转换成 pdf
- C#实体类null自动转空字符串