求助:TypeError报错——MeComCommon._set()缺少必需参数'self'
解决TypeError: MeComCommon._set()缺少必要参数'self'的问题
问题代码与报错
定义的类方法
@classmethod def set_parameter(self, value, parameter_name=None, parameter_id=None, *args, **kwargs): """ Set the new value of a parameter given by name or id. Returns success. :param value: :param parameter_name: :param parameter_id: :param args: :param kwargs: :return: bool """ # get the query object vs = self._set(value=value, parameter_id=parameter_id, parameter_name=parameter_name, *args, **kwargs) # check if value setting has succeeded # # Not necessary as we get an acknowledge response or Value is out of range # exception when an invalid value was passed. # current implementation also often fails due to rounding, e.g. setting 1.0 # but returning 0.999755859375 when performing a self.get_parameter # value_set = self.get_parameter(parameter_id=parameter_id, parameter_name=parameter_name, *args, **kwargs) # return True if we got an ACK return type(vs.RESPONSE) == ACK
调用方式
mcc = mecom.MeComCommon() mcc.set_parameter(value=-40, parameter_id=3000)
报错信息
Traceback (most recent call last): File "C:\Users\Michal\Desktop\THERMAL ELEPHANT V3 TEST JIG\Python Script\main.py", line 189, in <module> mcc.set_parameter(value=-40, parameter_id=3000) File "C:\Users\Michal\Desktop\THERMAL ELEPHANT V3 TEST JIG\Python Script\mecom\mecom.py", line 659, in set_parameter vs = self._set(value=value, parameter_id=parameter_id, parameter_name=parameter_name, *args, **kwargs) TypeError: MeComCommon._set() missing 1 required positional argument: 'self'
问题原因
set_parameter被标记为@classmethod类方法,类方法的第一个参数实际是类本身(通常命名为cls),但你这里用了self作为参数名。当你通过实例mcc调用这个类方法时,传入的self其实是MeComCommon类,而非实例对象。而_set是实例方法,必须接收实例作为第一个参数,直接用类调用_set就会缺少必要的实例参数,触发报错。
解决方案
将set_parameter的@classmethod装饰器移除,改成普通的实例方法,这样self就会指向调用该方法的实例对象,调用self._set时就能正确传递实例参数:
def set_parameter(self, value, parameter_name=None, parameter_id=None, *args, **kwargs): """ Set the new value of a parameter given by name or id. Returns success. :param value: :param parameter_name: :param parameter_id: :param args: :param kwargs: :return: bool """ # get the query object vs = self._set(value=value, parameter_id=parameter_id, parameter_name=parameter_name, *args, **kwargs) # check if value setting has succeeded # # Not necessary as we get an acknowledge response or Value is out of range # exception when an invalid value was passed. # current implementation also often fails due to rounding, e.g. setting 1.0 # but returning 0.999755859375 when performing a self.get_parameter # value_set = self.get_parameter(parameter_id=parameter_id, parameter_name=parameter_name, *args, **kwargs) # return True if we got an ACK return type(vs.RESPONSE) == ACK
如果业务上必须保留set_parameter为类方法,需要确保_set也被定义为类方法,或者在set_parameter内部先创建实例再调用_set,但这种方式不符合你当前的调用逻辑,因此优先推荐第一种方案。
内容的提问来源于stack exchange,提问作者TeshE
相关产品推荐
相关产品推荐

