在这个例子中用到了反射和枚举的用法,里面有各种注意事项,是个不错的练习题
total_couese_list = [] # 把函数run中的变量当成全局变量放在这里 class Course(): def __init__(self, name, price, period): self.name = name self.price = price self.period = period func_list = [{"text": "选课", "name": "select_course", "param": "cs"}, {"text": "查看课程", "name": "show_selectd_course", "param": "None"}, {"text": "删除课程", "name": "del_selectd_course", "param": "None"}, ] class Student(): def __init__(self, name): self.name = name self.course = [] def select_course(self, ): """选择课程,已选则不能再选""" # 当选课的时候,把所选课程都罗列出来,同下面主函数中的枚举一样 for i, iterm in enumerate(total_couese_list, 1): # 枚举传参数,前面是可迭代对象,后面是序号,默认从几开始 print(i, iterm.name, ) # 因为加入到列表中的是一个对象,对象取值只能通过“.属性”这种方法 num = input("请输入你要选的课程") num = num - 1 course_obj = total_couese_list[num] if course_obj not in self.course: self.course.append(course_obj) def show_selectd_course(self): """查看已选择的课程""" def del_selectd_course(self): """删除已选择的课程""" def run(): """ 主程序 1,根据Course类创建10个课程 2,用户输入姓名,动态创建学生对象 3,查看所选课程 4,为学生选课 5,删除已选课程 :return: """ # total_couese_list=[] #把total_couese_list当成全局变量 for i in range(10): obj = Course('XX-%s' % i, 90, 90) total_couese_list.append(obj) # 添加到列表中的是10个实例 stu_name = input("请输入学生姓名:") # 这两个一起写就可以实列化一个对象,这本来没有什么了不起, stu = Student(stu_name) # 但是养成一种习惯就代表了一种思路 for key, iterm in enumerate(Course.func_list, 1): # 枚举传参数,前面是可迭代对象,后面是序号,默认从几开始 print(key, iterm["text"]) # 拿到Course中的字符串,准备做反射 while True: #***while这个逻辑关系是写在fun中的,whil要是顶格写后面的实例stu就不能识别了,在这出过错,太坑了 num = int(input("请输入要执行的功能序号:")) num = num - 1 name = Course.func_list[num]["name"] # 通过枚举的提示,在借助用户的输入和枚举关联起来 print(name) # 现在的name值是取到的要执行的功能的名字,只是个字符串而已 act1 = getattr(stu, name) # 通过反射取到Student类中的对应方法,具体取哪个方法是用户输入序号,通过枚举关联到字符串取值的 print(act1()) # 上面取到的是一个函数名 # 通过反射取到的类中的方法怎么传参?主要看反射取值的时候传参是类还是对象,在就是缩进,缩进 #写错了,逻辑就乱了 act1() if __name__ =="__main__": run()