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
相关产品推荐
相关产品推荐

