python之反射--選課例子
阿新 • • 發佈:2018-09-01
縮進 append 默認 查看 字符 select ini input 主程
在這個例子中用到了反射和枚舉的用法,裏面有各種註意事項,是個不錯的練習題
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()
python之反射--選課例子