You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现类内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("接收数据")

代码说明

  1. 装饰器结构:外层requires_connected接收被装饰的方法func,内层wrapper接收实例self和方法的任意参数。
  2. 状态检查:wrapper先判断self.connected,未连接则直接返回;连接正常则调用原方法并返回结果。
  3. 元信息保留:@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 21:32:37