1. 程式人生 > >python之反射--選課例子

python之反射--選課例子

縮進 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之反射--選課例子