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()
原文地址:https://www.cnblogs.com/zhuhaofeng/p/9570004.html