爱听歌丶的小圆点 2024-04-12 16:17 采纳率: 57.1%
浏览 1
已结题

python没有重载的概念,那确实需要重载的话?

比如,某方法定义了conn、token、data、flag三个形参,表示套接字、登录成功后的一个随机标识字串、要发送JSON数据、消息号的标志(消息号是递增的),这个方法定义的是TCP JSON收发规则,别的类或方法调用这个方法时,一般把这四个参数传过来用来进行收发数据
但是,有的方法(比如持续的心跳包发送),客户端异步发出去心跳之后,并不需要接收设备端的回复,要是一定得接收回复的话,还会造成一些回传JSON被抢收,打乱其它正常的收发操作,这时候首先想到的就是,这个独立的心跳收发方法,再多传一个参数,标识这个方法是特殊的,收发那边判断有没有多传这个特殊参数,有的话就不要再接收回包了
但是,多传这个参数是收发方法里面没有定义的,按照传统的面向对象思想,再把这个收发心跳的方法加个特殊参数重载一条就行了,参数个数不同的该方法一块用,互不干扰,但是,python里面又没有重载,定义几个形参就必须是几个,不能多传
那么,是不是就只有在原参数里边传递些特殊标识,收发方法收到后再剥离掉标识,或是收发分开定义方法了?

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-12 16:17
    关注

    引自免费微信小程序:皆我百晓生

    在Python中,由于缺乏传统意义上的方法重载(Overloading)功能,我们可以通过以下几种方式来实现类似的功能:

    1. 使用默认参数:为额外的参数设置默认值,这样在调用时可以选择性地提供它。
    2. 使用可变数量的位置参数(*args):允许函数接受任意数量的位置参数。
    3. **使用关键字参数(kwargs):允许函数接受任意数量的关键字参数。

    对于您的场景,我们可以选择使用关键字参数(**kwargs)。在这种情况下,您可以为心跳包发送方法添加一个额外的标志参数,然后在方法内部检查这个标志决定是否接收回复。以下是示例代码:

    class ConnectionManager:
        def __init__(self, conn, token):
            self.conn = conn
            self.token = token
    
        def send_data(self, data, flag, receive_response=True, **kwargs):
            # 检查是否有特殊标志,如果没有,则使用默认值
            heartbeat = kwargs.pop('heartbeat', False)
    
            if not heartbeat:
                # 这里执行常规的收发逻辑,包括接收回复
                # ...
                pass
            else:
                # 心跳包处理,不接收回复
                # 发送心跳包
                self.send_heartbeat()
    
        def send_heartbeat(self):
            # 实现心跳包发送逻辑
            # ...
            pass
    
    # 使用示例:
    connection_manager = ConnectionManager(conn, token)
    connection_manager.send_data(data, flag)  # 常规收发
    connection_manager.send_data(data, flag, heartbeat=True)  # 心跳包发送,不接收回复
    

    在这个例子中,send_data 方法接受 data, flag, 和 receive_response 参数作为常规收发所需的参数。receive_response 默认为 True,表示正常接收回复。同时,通过 **kwargs 接受额外的参数。当调用时,可以传入 heartbeat=True 来标记这是一个心跳包发送,此时不会尝试接收回复。这种方法可以让您在不改变原始方法签名的情况下,灵活地扩展功能。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 8月6日
  • 已采纳回答 7月29日
  • 创建了问题 4月12日