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()

浙公网安备 33010602011771号