python之反射--選課例子

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