# 装饰器没有参数时,最外层参数是func(被修饰函数),有参数时最外层是个带参数的装饰器,参数是n(该参数),里面再加一层装饰器,接受func参数。
''' 1.函数装饰器 '''
# def count_call(func):
# def wrapper(*args, **kwargs):
# wrapper.call_count += 1
# result = func(*args, **kwargs)
# print(f'function {func.__name__} has been called for {wrapper.call_count} times.')
# return result
# wrapper.call_count = 0 # 初始化wrapper函数的自定义属性call_count
# return wrapper
#
# @count_call
# def say_hello():
# print("hello a hello")
#
# say_hello()
# say_hello()
# say_hello()
''' 2.带参数的函数装饰器 '''
# def repeat(n): # 返回装饰器的装饰器,接收装饰器的参数
# def decoration(func): # 装饰器
# def wrapper(*args, **kwargs): # 被替换的函数
# result = None
# for _ in range(n):
# result = func(*args, **kwargs)
# return result # 被替换函数的返回值
# return wrapper # 被替换函数
# return decoration # 装饰器
#
# @repeat(3)
# def say_hello():
# print("hello a hello")
#
# say_hello()
''' 3.类装饰器 '''
# class count_call:
# def __init__(self, func):
# self.func = func
# self.call_count = 0
#
# # 当一个对象实现了 __call__ 方法时,你就可以使用圆括号 () 来调用这个对象,就像调用一个普通函数一样。
# def __call__(self, *args, **kwargs):
# self.call_count += 1
# result = self.func(*args, **kwargs)
# print(f'function {self.func.__name__} has been called for {self.call_count} times.')
# return result
'''
实际上,@count_call 等价于 say_hello = count_call(say_hello)。
count_call(say_hello) 创建了一个 count_call 类的实例,并将 say_hello 传递给 __init__ 方法。
say_hello 现在是一个 count_call 类的实例,而不是原来的函数。
'''
# @count_call
# def say_hello():
# print("hello a hello")
#
# say_hello()
# say_hello()
# say_hello()
''' 4.带参数的类装饰器 '''
class count_call:
def __init__(self, n):
self.n = n # 传入参数
def __call__(self, func): # 注意在此处传入被替换函数
def wrapper(*args, **kwargs):
result = None
for _ in range(self.n):
result = func(*args, **kwargs)
return result
return wrapper
'''
实际上,@count_call(3) 等价于 say_hello = count_call(3)(say_hello)。
count_call(3) 创建了一个 count_call 类的实例,并将 3 传递给 __init__ 方法。
count_call(3)(say_hello) 调用 count_call 类的 __call__ 方法,并将 say_hello 传递给 __call__ 方法。
__call__ 方法返回 wrapper 函数,say_hello 现在是一个 wrapper 函数,而不是原来的 say_hello 函数。
'''
@count_call(3)
def say_hello(name):
print(f"Hello, {name}")
say_hello("Alice")
LeonDL168
- 粉丝: 3003
- 资源: 785
最新资源
- usb转串口,串口是电子设计的必备通讯接口,本USB转串口模块采用CH340和FT232两款芯片,可通过跳线帽选择使用CH340还是FT232,尺寸61*35mm 电脑端接口采用USB A型公座和M
- Cesium 模型-Y20模型
- S7-1500项目案例程序,带5个S7-1200轮询,5个ET200SP,博图软件编程 PTO脉冲模式控制20个轴,100个气缸,与2台机器人联动 采用ModbusRTU 485通讯,PROFIN
- fx3u PLC,此方案包含C语言源代码和原理图及PCB可直接打样学习实验 方便深入学习 可直接使用GXworks2软件编写梯形图 资料已包含原理图和PCB文件,送keil AD11,GXw
- Socket通信框架,客户端部分,这是从一个商业级的物联网项目分离出来的核心代码,让你绕过最难写的Socket管理,功能带有断线重连,仅一个DLL文件,c#下直接使用,调用时一个激活语句即可,有一个数
- stm32单片机 北斗GPS 定位 vb上位机显示 蓝牙主从级通信 主单片机获取GPS北斗模块定位信息后,通过蓝牙发送给从模块 从蓝牙模块,从模块通过串口讲定位信息发送给vb上位机 上位机实
- Cesium 模型-E-3 AWACS(哨兵)预警机
- JT2Go(15.1.24284)
- 输入框无焦点进行扫码获取数据信息
- osfp的资源开发思路
- 基于高光谱数据的叶片水分估测方法研究 【Matlab Python Origin】文章中的代码和结果 https://blog.csdn.net/m0-49684834/article/details
- Web3开发之智能合约项目基础教程
- 小程序精选源码-o2o行业
- 极空,电动汽车,电动叉车电池管理系统BMS,24串2A主动能量转移均衡,放电继电器,充电继电器,继电器需要自己配 适合大功率的电动叉车车之类的
- 【小程序精选源码】- 报名预约
- 亚成微5V2A非标芯片方案
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈