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

如何以字典键为实例名动态创建Courses类实例?

动态创建课程类实例并通过课程名引用

推荐方案:用字典集中管理实例

直接将所有课程实例存储在字典中,既避免命名空间污染,又方便统一管理,是处理大量实例的最优选择。

class Courses:
    def __init__(self, course, course_id, limit):
        self.course = course
        self.course_id = course_id
        self.limit = limit

    def __str__(self):
        return f'Course: {self.course}, Course ID: {self.course_id}, Limit: {self.limit}'

courses = {
    'English': {'course_id': 1000, 'limit': 30},
    'Math': {'course_id': 1001, 'limit': 20},
    'History': {'course_id': 1002, 'limit': 50},
    'Science': {'course_id': 1003, 'limit': 25},
}

# 初始化存储实例的字典
course_instances = {}
for course_name, info in courses.items():
    # 将课程名转为小写作为键,方便统一调用格式
    key = course_name.lower()
    course_instances[key] = Courses(course_name, info['course_id'], info['limit'])

# 测试访问
print(course_instances['math'].limit)  # 输出:20
print(course_instances['math'])        # 输出:Course: Math, Course ID: 1001, Limit: 20

可选方案:动态添加到命名空间(不推荐)

如果一定要通过math.limit这种直接变量名访问,可以借助globals()动态创建变量,但这种方式容易覆盖现有变量,不利于维护,仅适合小规模场景。

for course_name, info in courses.items():
    var_name = course_name.lower()
    # 动态添加到全局命名空间
    globals()[var_name] = Courses(course_name, info['course_id'], info['limit'])

# 直接访问变量
print(math.limit)  # 输出:20
print(math)        # 输出:Course: Math, Course ID: 1001, Limit: 20

优雅进阶:用容器类管理实例

通过自定义容器类,将实例作为类属性存储,既保留属性式访问的便捷性,又避免污染全局命名空间。

class CourseContainer:
    def __init__(self, courses_dict):
        for course_name, info in courses_dict.items():
            # 动态设置属性
            setattr(self, course_name.lower(), Courses(course_name, info['course_id'], info['limit']))

# 创建容器对象
course_box = CourseContainer(courses)

# 通过属性访问实例
print(course_box.math.limit)  # 输出:20
print(course_box.math)        # 输出:Course: Math, Course ID: 1001, Limit: 20

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:42:11