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

Python类方法装饰器含self参数报错:TypeError参数不匹配

问题解决:类方法装饰器的参数错误

错误原因

你遇到的TypeError: function takes 2 positional arguments but 1 were given,根源是装饰器的定义逻辑错误:

  • 装饰器_get_time_from_server被错误定义为第一个参数接收self,第二个参数接收被装饰函数func;
  • 但在类定义阶段使用@_get_time_from_server时,Python只会将被装饰的_get_ntp_time作为唯一参数传入装饰器,缺少self参数,因此触发参数不匹配的错误。
  • 你误解了装饰器访问实例属性的方式:不需要把self传给装饰器本身,而是通过被装饰的实例方法自动传入的self来访问属性。

修正方案

调整装饰器的参数结构,让装饰器的第一个参数是被装饰函数func,内部的wrapper函数接收self作为第一个参数(因为被装饰的是实例方法,调用时会自动传入self):

修正后的装饰器代码

def _get_time_from_server(func):
    # 尝试从NTP服务器获取时间
    # 成功则调用原函数,否则终止操作
    # 这是一个装饰器函数
    def wrapper(self, *args, **kwargs):
        if self._wifi.is_enabled():
            self._wifi.connect_to_ap()
            # 检查是否已连接
            if self._wifi.is_connected_to_ap():
                # 查询NTP服务器
                log.info('Querying NTP Server.')
                res = self._query_server()
                if res:
                    return func(self, *args, **kwargs)
                else:
                    log.warning('Could not retrieve time from NTP server.')
                    return
            return
        return
    return wrapper

被装饰的方法保持不变

@_get_time_from_server
def _get_ntp_time(self) -> tuple:
    # 返回NTP服务器时间
    return self._time

关键逻辑说明

  • 当调用self._get_ntp_time()时,实际执行的是wrapper(self);
  • wrapper内部通过传入的self可以正常访问self._wifi、self._query_server()等实例属性和方法;
  • 原函数_get_ntp_time在wrapper中通过func(self, *args, **kwargs)调用,确保self正确传递给原方法。

内容的提问来源于stack exchange,提问作者Sebastian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 12:17:18