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

如何在类中调用其他类的方法?Python代码报错求助

问题分析与解决

一、类间方法调用的正确方式

类之间调用方法的核心是基于实例交互,常见方式有两种:

  • 创建目标类的实例,通过实例直接调用方法(最常用,适合类之间是关联关系的场景,比如学生和图书馆)
  • 若方法不依赖实例属性,可定义为@classmethod类方法或@staticmethod静态方法,直接通过类名调用

二、代码错误排查与修正

错误根源

  1. 错误的方法调用逻辑:你直接用Library.show(self)这种方式,把student实例当作Library实例传入,但Book_list是Library实例的专属属性,student实例根本没有这个属性,自然触发AttributeError。
  2. __init__方法违规:Python中__init__方法不能返回非None值,你在Library的__init__里返回self.BookName,不符合语法规范。
  3. 书籍列表状态丢失:每次调用show方法都会重新初始化Book_list,导致借还操作的修改被重置,无法保留图书馆的真实书籍状态。
  4. 循环重复创建实例:每次循环都新建student实例,完全没必要,还会丢失之前的操作状态。
  5. 退出逻辑错误:提示输入Q退出,但代码里却判断slc==4,且强制转成int,输入Q会直接报错。

修正后的完整代码

class Library:
    def __init__(self):
        # 初始化时就创建书籍列表,保证状态持久
        self.Book_list = ["English", "Python", "Urdu"]
    
    def show_books(self):
        print("你好!以下是可借阅的书籍:\n")
        print("\n".join(self.Book_list))
    
    def borrow_book(self, book_name):
        book_name = book_name.capitalize()
        if book_name in self.Book_list:
            self.Book_list.remove(book_name)
            print("借阅成功!请在30天内归还,谢谢!")
        else:
            print("抱歉,这本书暂时没有库存,请稍后再试!")
    
    def return_book(self, book_name):
        book_name = book_name.capitalize()
        if book_name not in self.Book_list:
            self.Book_list.append(book_name)
            print("感谢归还书籍!")
        else:
            print("这本书已经在馆内了,感谢你的配合!")

class Student:
    def __init__(self, library):
        # 学生持有图书馆实例,通过实例调用方法,这是类间交互的正确姿势
        self.library = library
    
    def check_books(self):
        self.library.show_books()
    
    def borrow(self):
        book_name = input("\n请输入要借阅的书籍名称:")
        self.library.borrow_book(book_name)
    
    def return_book(self):
        book_name = input("\n请输入要归还的书籍名称:")
        self.library.return_book(book_name)

# 初始化图书馆和学生实例,循环内复用
library = Library()
stu = Student(library)

while True:
    menu = """

====================== 欢迎来到SSUET图书馆 ======================

请选择操作:
1. 查看书籍列表
2. 借阅书籍
3. 归还书籍
Q. 退出系统
"""
    print(menu)
    choice = input("请输入你的选择:").strip()
    if choice == '1':
        stu.check_books()
    elif choice == '2':
        stu.borrow()
    elif choice == '3':
        stu.return_book()
    elif choice.upper() == 'Q':
        print("退出成功,再见!")
        break
    else:
        print("输入无效,请重新选择!")

关键修改说明

  • 重构类关系:让Student初始化时接收Library实例,通过这个实例调用图书馆的方法,符合现实逻辑,也解决了属性找不到的问题。
  • 修正状态管理:把Book_list放在Library的__init__中初始化,确保借还操作的修改能被保留。
  • 拆分职责:把输入书籍名称的逻辑移到Student方法中,让Library专注于书籍管理,代码更清晰。
  • 修复退出逻辑:直接判断输入的字符串,避免类型转换错误,支持大小写Q退出。

三、类间调用方法的常见场景总结

  • 关联关系(如学生-图书馆):创建目标类实例,通过实例调用方法(本次修正采用的方式)。
  • 继承关系(如子类-父类):子类可直接调用父类方法,用super()或父类名调用,但要确保继承逻辑合理。
  • 无状态工具方法:用@classmethod或@staticmethod定义类方法/静态方法,直接通过类名调用,无需创建实例。

内容的提问来源于stack exchange,提问作者Muhammad Shahrukh Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 11:54:20