在這個例子中用到了反射和枚舉的用法,裏面有各類注意事項,是個不錯的練習題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()