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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:24:21