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

Python跨类调用函数报错,如何正确创建类并实现方法调用?

解决MainMenu调用Options类方法的报错问题

核心错误原因

  • 类加载顺序错误:MainMenu类定义里的代码会在类被加载时立刻执行,这时候Options类还没定义,自然找不到这个类。
  • 方法调用语法错误:chosenOption是用户输入的字符串,拿它来调用Options类的方法完全不符合Python语法。
  • 类结构设计混乱:把程序执行逻辑直接写在类定义的顶层,而不是放在类的方法里。

修复后的完整代码

# 先定义Options类,确保后续调用时类已存在
class Options:
    def issuing_new_ticket(self):
        print("Issuing new ticket in progress")
        ticket_title = input("Title of the ticket: ")
        ticket_description = input("Describe the issue/request: ")
        print(f"Ticket '{ticket_title}' created successfully!")

    def check_ticket_status(self):
        print("Checking ticket status...")
        # 这里可以补充查询逻辑

    def edit_ticket(self):
        print("Editing ticket...")
        # 这里可以补充编辑逻辑

class MainMenu:
    def __init__(self):
        # 实例化Options类,后续通过这个实例调用方法
        self.options_handler = Options()
        self.show_menu()

    def show_menu(self):
        while True:
            print("\nWelcome to Ticket Tracker")
            print("Main Menu")
            print("1 - Issue new Ticket")
            print("2 - Check Ticket Status")
            print("3 - Edit Ticket")
            print("4 - Exit")
            chosen_option = input("Enter your choice here: ")

            # 根据用户选择调用对应方法
            if chosen_option == "1":
                self.options_handler.issuing_new_ticket()
            elif chosen_option == "2":
                self.options_handler.check_ticket_status()
            elif chosen_option == "3":
                self.options_handler.edit_ticket()
            elif chosen_option == "4":
                print("Exiting...")
                break
            else:
                print("Invalid choice, please enter 1-4")

# 启动程序
if __name__ == "__main__":
    MainMenu()

关键修复点

  • 调整类定义顺序:先写Options类,保证MainMenu调用时能找到它。
  • 重构类结构:把菜单逻辑放进show_menu()方法,通过__init__初始化时启动,避免类加载时直接执行代码。
  • 正确实例化类:在MainMenu里创建Options的实例,通过实例调用方法,这是Python中调用实例方法的标准方式。
  • 添加循环逻辑:让菜单可以重复操作,直到用户选择退出。
  • 修正变量拼写:把ticketDescribtion改成符合规范的ticket_description。
  • 移除无用全局变量:用类实例和方法内部变量替代全局变量,避免全局变量带来的耦合问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:10:32