在这个例子中用到了反射和枚举的用法, 里面有各种注意事项, 是个不错的练习题
- 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()
来源: http://www.bubuko.com/infodetail-2750662.html