Python如何创建类对象列表并正确调用实例的方法与属性
问题解答
通过类对象列表存储实例、调用实例方法的思路完全可行,你遇到的问题都是代码写法错误导致的,不存在列表自动存成字符串的情况。
现有代码的几个核心错误
- 主程序入口判断写法错误:
if '__main__':是恒为真的无效判断,正确写法为if __name__ == '__main__':。你原来在__init__方法里直接写listofmodules.append(self)会因为列表未在全局作用域提前定义抛出NameError,不建议在类初始化方法里直接操作外部全局列表,耦合度太高,推荐在主逻辑里实例化后手动append。 __str__方法存在语法错误:self.time "tutored by"中间缺失+拼接符,运行会直接报语法错。- 查找逻辑错误:
listofmodules.index(to_use)的逻辑是拿输入的字符串和列表里的元素做相等匹配,你没有给类定义相等判断规则的话,字符串和Modul实例永远不相等,会直接抛出ValueError。你误以为列表存的是字符串,本质是打印列表时,Python自动调用了实例的__str__方法输出可读文本,看起来像字符串,但实际存储的始终是Modul实例,可以通过print(type(listofmodules[0]))验证,输出会是Modul类类型,不是str。 - 方法调用写法错误:
listofmodules[index].a_function没有加括号,只会拿到方法对象本身,不会执行方法逻辑,正确调用需要加括号写成listofmodules[index].a_function()。
可直接运行的修正版本
class Modul: def __init__(self, name, dozent, time): self.name = name self.dozent = dozent self.time = time def __str__(self): return f"{self.name} at {self.time} tutored by {self.dozent}" def a_function(self): # 自定义方法逻辑 print(f"已选中模块:{self.name},授课教师{self.dozent},时长{self.time}") if __name__ == '__main__': listofmodules = [] # 实例化模块并加入列表 listofmodules.append(Modul("Math", "Prof. Li", "2 hrs")) listofmodules.append(Modul("Python", "Prof. Wang", "3 hrs")) listofmodules.append(Modul("Database", "Prof. Zhang", "1.5 hrs")) to_use = input("What module would you like to use?").strip() # 最稳妥的查找方式:遍历匹配实例的name属性 target = None for mod in listofmodules: if mod.name == to_use: target = mod break if target: target.a_function() else: print("未找到对应名称的模块")
如果你想直接用index()方法查找,可以给Modul类增加相等判断的特殊方法,让实例和字符串比较时自动匹配name属性:
# 在Modul类内部增加该方法 def __eq__(self, other): if isinstance(other, str): return self.name == other return super().__eq__(other)
加完之后就可以直接用下标查找:
try: idx = listofmodules.index(to_use) listofmodules[idx].a_function() except ValueError: print("未找到对应名称的模块")
内容的提问来源于stack exchange,提问作者user18991295
相关产品推荐
相关产品推荐

