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

