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

Python 3.5中如何让菜单函数返回经多函数处理后的类实例

Python 3.5 菜单驱动的自定义类实例处理方案

嘿,我懂你现在的需求——用Python 3.5写个菜单驱动的小工具,把用户选的选项存在自定义类的实例里,还要在各个菜单函数之间传递这个实例,最后拿到处理完的版本对吧?我给你写个完整的可运行示例,你可以照着调整:

第一步:定义存储选项的自定义类

先创建一个类来封装所有用户选择的选项,这样不管多少菜单,都只需要传递这个实例,逻辑更清晰:

class UserOptions:
    def __init__(self):
        self.main_choice = None  # 存储主菜单选择的功能
        self.detail_settings = {}  # 存储子菜单的详细设置

第二步:编写菜单函数(主菜单+子菜单)

每个菜单函数都接收UserOptions实例作为参数,修改实例属性后再返回它,确保所有修改能在函数间传递:

主菜单函数

def main_menu(options):
    while True:
        print("\n=== 主菜单 ===")
        print("1. 选择图片处理功能")
        print("2. 选择文本处理功能")
        print("3. 查看当前已选选项")
        print("4. 退出并返回最终设置")
        
        user_input = input("请输入你的选择(1-4):")
        
        if user_input == "1":
            # 调用子菜单,更新实例并接收返回的新版本
            options = image_process_submenu(options)
        elif user_input == "2":
            options = text_process_submenu(options)
        elif user_input == "3":
            show_current_options(options)
        elif user_input == "4":
            print("退出菜单,当前设置已保存!")
            return options  # 返回处理后的实例
        else:
            print("输入无效,请重新选择!")

图片处理子菜单

def image_process_submenu(options):
    print("\n=== 图片处理子菜单 ===")
    print("A. 压缩图片")
    print("B. 调整分辨率")
    
    sub_choice = input("请选择处理类型(A/B):").upper()
    
    if sub_choice == "A":
        options.main_choice = "图片压缩"
        quality = input("请输入压缩质量(1-100):")
        try:
            options.detail_settings["compression_quality"] = int(quality)
            print(f"已设置图片压缩质量为{quality}%")
        except ValueError:
            print("输入不是有效数字,返回主菜单")
    elif sub_choice == "B":
        options.main_choice = "分辨率调整"
        width = input("请输入目标宽度:")
        height = input("请输入目标高度:")
        try:
            options.detail_settings["resolution"] = (int(width), int(height))
            print(f"已设置分辨率为{width}x{height}")
        except ValueError:
            print("输入不是有效数字,返回主菜单")
    else:
        print("无效选择,返回主菜单")
    
    return options  # 返回修改后的实例

文本处理子菜单

def text_process_submenu(options):
    print("\n=== 文本处理子菜单 ===")
    encoding = input("请选择文本编码(UTF-8/GBK):").upper()
    
    if encoding in ["UTF-8", "GBK"]:
        options.main_choice = "文本编码转换"
        options.detail_settings["target_encoding"] = encoding
        print(f"已设置目标编码为{encoding}")
    else:
        print("无效编码选择,返回主菜单")
    
    return options

查看当前选项的辅助函数

def show_current_options(options):
    print("\n=== 当前已选设置 ===")
    print(f"主功能:{options.main_choice if options.main_choice else '未选择'}")
    print(f"详细设置:{options.detail_settings if options.detail_settings else '无'}")

第三步:启动程序

在主程序里初始化实例,调用主菜单,最后拿到处理后的实例:

if __name__ == "__main__":
    # 初始化空的选项实例
    user_options = UserOptions()
    # 启动主菜单,获取最终处理后的实例
    final_options = main_menu(user_options)
    
    # 这里可以对final_options做后续操作,比如保存到文件、执行对应功能等
    print("\n最终保存的设置:")
    print(f"主功能:{final_options.main_choice}")
    print(f"详细设置:{final_options.detail_settings}")

关键注意点

  • 所有菜单函数都必须返回修改后的实例:因为Python中对象是引用传递,但如果在函数内部重新赋值实例(比如options = UserOptions()),就会断开和外部的引用,所以最好的方式是修改实例属性后返回它,确保外部能拿到最新的状态。
  • 用while True循环保持菜单持续运行,直到用户选择退出,才返回最终实例。
  • 加入了输入验证和异常处理,避免程序因为无效输入崩溃,提升用户体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:44:26