zoukankan      html  css  js  c++  java
  • python之反射--选课例子

    在这个例子中用到了反射和枚举的用法,里面有各种注意事项,是个不错的练习题

    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()
  • 相关阅读:
    golang 数据结构 优先队列(堆)
    leetcode刷题笔记5210题 球会落何处
    leetcode刷题笔记5638题 吃苹果的最大数目
    leetcode刷题笔记5637题 判断字符串的两半是否相似
    剑指 Offer 28. 对称的二叉树
    剑指 Offer 27. 二叉树的镜像
    剑指 Offer 26. 树的子结构
    剑指 Offer 25. 合并两个排序的链表
    剑指 Offer 24. 反转链表
    剑指 Offer 22. 链表中倒数第k个节点
  • 原文地址:https://www.cnblogs.com/zhuhaofeng/p/9570004.html
Copyright © 2011-2022 走看看