• 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()
  • 相关阅读:
    JVisualVM远程监控
    周记 2014.11.22
    读取配置文件
    周记 2014.11.15
    MyBatis 逆向工程介绍
    PyTorch模型加载与保存的最佳实践
    ubuntu 服务器 php 环境简单搭建
    【重温广州读书会三青年自白,想念在深圳建会工人斗争中积极声援的他们!!】
    EventBus 3.0 的基本使用
    搭建Hexo博客
  • 原文地址:https://www.cnblogs.com/zhuhaofeng/p/9570004.html
Copyright © 2020-2023  润新知