如何实现类内requires_connected装饰器以避免重复连接状态判断?
类内连接状态检查装饰器的正确实现
错误原因分析
你遇到的TypeError是因为装饰器结构错误:如果把装饰器定义成需要接收self和func两个参数,当用@requires_connected装饰方法时,Python会把被装饰的方法作为第一个参数传入装饰器,导致缺少func参数。类内装饰器在定义阶段还没有实例,不能直接将self作为装饰器的参数,而是要在包装函数中获取实例对象。
正确实现方式
使用嵌套函数结构实现装饰器,结合functools.wraps保留原方法的元信息(如函数名、文档字符串):
import functools class A: def __init__(self): self.connected = False # 初始未连接 def requires_connected(func): @functools.wraps(func) def wrapper(self, *args, **kwargs): # 检查连接状态 if not self.connected: print("错误:未建立连接,无法执行操作") return # 或根据需求抛出异常 # 连接正常,执行原方法 return func(self, *args, **kwargs) return wrapper @requires_connected def send(self, data): print(f"发送数据: {data}") @requires_connected def receive(self): print("接收数据")
代码说明
- 装饰器结构:外层
requires_connected接收被装饰的方法func,内层wrapper接收实例self和方法的任意参数。 - 状态检查:
wrapper先判断self.connected,未连接则直接返回;连接正常则调用原方法并返回结果。 - 元信息保留:
@functools.wraps(func)确保被装饰后的方法仍保留原方法的名称、文档等信息,便于调试和反射。
扩展:带自定义提示的装饰器
如果需要给不同方法设置不同的提示信息,可以给装饰器增加一层参数接收:
import functools class A: def __init__(self): self.connected = False def requires_connected(msg="未连接,无法执行操作"): def decorator(func): @functools.wraps(func) def wrapper(self, *args, **kwargs): if not self.connected: print(f"错误:{msg}") return return func(self, *args, **kwargs) return wrapper return decorator @requires_connected(msg="发送前请先建立连接") def send(self, data): print(f"发送数据: {data}") @requires_connected def receive(self): print("接收数据")
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

