如何优雅修改Python类中函数传入的属性?以on_message为例
更Pythonic的方式修改类实例的on_message属性
场景说明
你使用外部库的my_class创建了WebSocket客户端实例,但后续才定义消息处理函数do_stuff_with_message,不想通过重新实例化的方式替换on_message属性,希望找到更优雅的实现方式。
可行方案
1. 直接修改实例属性(最便捷)
如果my_class的__init__方法将on_message参数赋值给了实例属性(这类WebSocket客户端库通常会这么做),直接给实例的on_message属性赋值即可,无需重新创建对象:
# 已创建实例 ws_client = my_class(stream_url="wss://stream.actual:6969/ws") # 后续定义消息处理函数 def do_stuff_with_message(): # 处理消息的逻辑 # 直接替换属性 ws_client.on_message = do_stuff_with_message ws_client.my_function(key="Dante")
2. 前置声明消息处理函数(更规范)
如果允许提前定义do_stuff_with_message,可以在实例化时直接传入该函数,从根源避免后续修改:
# 提前定义消息处理函数 def do_stuff_with_message(): # 处理消息的逻辑 # 实例化时直接传入参数 ws_client = my_class( stream_url="wss://stream.actual:6969/ws", on_message=do_stuff_with_message ) ws_client.my_function(key="Dante")
3. 使用库提供的官方API(优先选择)
部分外部库会专门提供设置回调的方法(比如set_on_message),如果my_class有这类方法,优先使用官方推荐的方式,保证兼容性:
ws_client.set_on_message(do_stuff_with_message)
为什么不推荐重新实例化?
重新创建my_class实例会生成全新的对象,之前的WebSocket连接状态(如果已建立)会丢失,而且代码冗余,不符合Python简洁性的设计原则。
内容的提问来源于stack exchange,提问作者led_farmer
相关产品推荐
相关产品推荐

