如何在类中调用其他类的方法?Python代码报错求助
问题分析与解决
一、类间方法调用的正确方式
类之间调用方法的核心是基于实例交互,常见方式有两种:
- 创建目标类的实例,通过实例直接调用方法(最常用,适合类之间是关联关系的场景,比如学生和图书馆)
- 若方法不依赖实例属性,可定义为
@classmethod类方法或@staticmethod静态方法,直接通过类名调用
二、代码错误排查与修正
错误根源
- 错误的方法调用逻辑:你直接用
Library.show(self)这种方式,把student实例当作Library实例传入,但Book_list是Library实例的专属属性,student实例根本没有这个属性,自然触发AttributeError。 __init__方法违规:Python中__init__方法不能返回非None值,你在Library的__init__里返回self.BookName,不符合语法规范。- 书籍列表状态丢失:每次调用
show方法都会重新初始化Book_list,导致借还操作的修改被重置,无法保留图书馆的真实书籍状态。 - 循环重复创建实例:每次循环都新建
student实例,完全没必要,还会丢失之前的操作状态。 - 退出逻辑错误:提示输入
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
相关产品推荐
相关产品推荐

