標籤:return enumerate run 縮排 預設 term 選擇 通過 one
在這個例子中用到了反射和枚舉的用法,裡面有各種注意事項,是個不錯的練習題
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之反射--選課例子