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

Python子类调用父类方法报错:AttributeError与TypeError求助

问题描述

我想通过线程调用子类中的循环方法,该方法会执行父类的方法,但运行报错,推测是继承使用有误。以下是极简代码示例:

class Echo(WebSocket):

    def __init__(self, client, server, sock, address):
        super().__init__(server, sock, address)
        self.modbus = client

    def temp_control(self, value):
        do_something(value)
        return True

class Temperature_Control3(Echo):

    def __init__(self):
        super().__init__()
        self.value

    def control(self, value):
        while True:
            print("temp_controll")
            self.temp_control(self, value) # 调用Echo类中的方法
            time.sleep(4)

def main():
    with ModbusClient(host=HOST, port=PORT) as client:
        client.connect()
        time.sleep(0.01)

        print("Websocket server on port %s" % PORTNUM)
        server = SimpleWebSocketServer('', PORTNUM, partial(Echo, client))


        control = Temperature_Control3()
        t3 = threading.Thread(target=control.control, args=('', 'get'), daemon=False)
        t3.start()


        try:
            t1 = threading.Thread(target=server.serveforever())
            t1.start()
            for thread in threading.enumerate():
                print(thread.name)
        finally:
            server.close()

原本t1线程启动正常,但t3线程无法启动,出现错误。我面向对象编程经验较少,希望得到帮助!

编辑:又遇到新错误:

Traceback (most recent call last):
  File "websocketserver6_threading.py", line 566, in <module>
    main()
  File "websocketserver6_threading.py", line 545, in main
    control = Temperature_Control3()
  File "websocketserver6_threading.py", line 516, in __init__
    super().__init__()
TypeError: __init__() missing 4 required positional arguments: 'client', 'server', 'sock', and 'address'

错误分析与修复

1. 子类初始化参数缺失

Temperature_Control3继承自Echo,但Echo的构造方法需要client, server, sock, address四个必填参数,子类初始化时调用super().__init__()没有传参,直接触发参数缺失错误。

如果Temperature_Control3不需要处理WebSocket连接(比如sock、address这些属性),没必要强行继承Echo,用组合替代继承更合理——直接把温度控制逻辑独立,或者让Temperature_Control3持有一个Echo实例来复用方法。

2. 父类方法调用错误

self.temp_control(self, value)写法错误,Python调用实例方法时会自动把当前实例作为第一个参数(即self)传入,不需要手动传递,正确写法是self.temp_control(value)。

3. 线程启动参数错误

threading.Thread(target=server.serveforever())中,你直接调用了serveforever()方法,导致主线程会被这个阻塞方法卡住,无法启动子线程。正确写法是传入方法本身,不要加括号:threading.Thread(target=server.serveforever)。

修正后的代码示例

class Echo(WebSocket):
    def __init__(self, client, server, sock, address):
        super().__init__(server, sock, address)
        self.modbus = client

    def temp_control(self, value):
        do_something(value)
        return True

# 用组合替代继承,Temperature_Control3专注温度控制逻辑
class Temperature_Control3:
    def __init__(self, modbus_client):
        self.modbus_client = modbus_client

    # 复用Echo的temp_control逻辑,或者直接实现
    def temp_control(self, value):
        do_something(value)
        return True

    def control(self, value):
        while True:
            print("temp_controll")
            self.temp_control(value)
            time.sleep(4)

def main():
    with ModbusClient(host=HOST, port=PORT) as client:
        client.connect()
        time.sleep(0.01)

        print("Websocket server on port %s" % PORTNUM)
        server = SimpleWebSocketServer('', PORTNUM, partial(Echo, client))

        # 传入modbus客户端实例初始化Temperature_Control3
        control = Temperature_Control3(client)
        # args传入control方法需要的参数,注意是元组格式
        t3 = threading.Thread(target=control.control, args=('get',), daemon=False)
        t3.start()

        try:
            # 传入方法对象,不要加()
            t1 = threading.Thread(target=server.serveforever)
            t1.start()
            for thread in threading.enumerate():
                print(thread.name)
            # 主线程等待t1结束,避免finally立刻关闭server
            t1.join()
        finally:
            server.close()

关键提示

  • 继承只适用于子类是父类的"特殊类型"场景,比如Cat继承Animal;如果只是要复用方法,用组合(持有实例)更灵活。
  • 调用实例方法时,永远不要手动传self参数。
  • 线程的target参数必须是函数/方法对象,不能是方法调用后的返回值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:15:32