Python跨类调用类变量报错:Socket服务中com_socket无法调用recv方法
解决AttributeError: 'str' object has no attribute 'recv'问题
问题根源
你在server.py中初始化了Setup实例并调用make_server()完成了Socket连接,此时该实例的com_socket是有效的Socket对象。但在verify.py里,你重新创建了一个全新的Setup实例,这个新实例的com_socket还是初始化时的空字符串"",自然没有recv()方法,导致报错。
解决方案
将server.py中已经完成初始化和连接的Setup实例传递给Verify类,让Verify复用同一个实例,而不是自己创建新的。
修改后的代码:
- server.py
import socket import threading from verify import Verify from setup import Setup setup = Setup() # 将已初始化的setup实例传入Verify verify = Verify(setup) setup.make_server() verify.verify()
- verify.py
class Verify: def __init__(self, setup_instance): # 保存传入的已初始化setup实例 self.setup = setup_instance def verify(self): # 使用复用的setup实例中的socket对象 message = self.setup.com_socket.recv(1024).decode('utf-8') # 可继续添加message处理逻辑
额外优化建议
在setup.py中修正类型标注,让代码更严谨:
import socket class Setup: def __init__(self): self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.client_list: list = [] # 初始化为None,明确类型为socket对象或None self.com_socket: socket.socket | None = None # accept返回的是(ip, port)元组,修正类型标注 self.addr: tuple[str, int] | None = None self.current_id: int = 0 # make_server方法保持不变
内容的提问来源于stack exchange,提问作者ACarrot
相关产品推荐
相关产品推荐

