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

求助: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:07:40