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

Flask项目中TypeError: object.__new__()参数异常问题求助

问题解决:Thread子类单例模式的实例化错误

报错代码行

cls._instance = super(MateDealer, cls).__new__(cls, *args, **kwargs)

触发调用代码

sc = SessionController(db, User, Product, Vend)

尝试过的无效修改

cls._instance = super().__new__()

问题根源

MateDealer继承自Thread,而Thread的__new__方法仅需接收类对象作为参数,不需要额外的*args和**kwargs。同时单例模式下,第二次实例化时不会执行__init__,但原代码未处理Thread初始化的重复执行问题,导致参数传递错误。

正确修改方案

调整MateDealer的单例实现逻辑,确保__new__方法参数传递正确,且__init__仅执行一次:

class MateDealer(Thread):
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            # Thread的__new__仅需传入cls参数
            cls._instance = super(MateDealer, cls).__new__(cls)
        return cls._instance

    def __init__(self, sc, *args, **kwargs):
        # 仅在实例未初始化时执行初始化逻辑,避免重复初始化Thread
        if not hasattr(self, 'sc'):
            Thread.__init__(self, *args, **kwargs)
            self.sc = sc
            self.serial = Serial()
            self.serial.port = '/dev/ttyACM0'
            self.serial.baudrate = 38400
            self.serial.bytesize = 8
            self.serial.parity = 'N'
            self.serial.stopbits = 1
            self.serial.timeout = 0.1
            self.running = False

修改说明

  1. __new__方法调整:去掉传递给super().__new__的*args和**kwargs,符合Thread类的实例化要求;Python3环境下可简化为super().__new__(cls)。
  2. __init__方法添加判断:通过检查实例是否已有sc属性,确保Thread的初始化和串口配置仅执行一次,避免单例多次创建时的重复初始化错误。

额外适配提示

若使用Python3,需将原代码中的print >> sys.stderr, e.message修改为print(e, file=sys.stderr),适配Python3的print语法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:50:16