Python學習筆記 9.0 模組 與 包 與 物件導向版學員管理系統

受折磨的靈魂。發表於2020-10-03

模組

Python 模組(Module),是一個Python檔案,以.py 結尾, 包含了Python 物件定義和Python語句。
模組能定義函式,類和變數, 模組裡也能包含可執行的程式碼。

一、匯入模組

1.匯入模組的方式

·0· import 模組名
·0· from 模組化名 import 功能名
·0· form 模組名 import *
·0· import 模組名 as 別名
·0· from 模組名 import 功能名 as 別名

2.匯入方式詳解

import

·0· 語法

# 1. 匯入模組
Import 模組名
Import 模組名1,模組名2……

# 2,呼叫功能
模組名.功能名()
# 需求: math 模組下sqrt()開平方計算
"""
1.匯入模組
2.測試是否匯入成功: 呼叫該模組的sqrt功能

"""
# 方法一:import 模組名;模組名.功能
import math
print(math.sqrt(9))

from……import……

·0· 語法
from 模組名 import 功能1, 功能2, 功能3……

# 方法二: from 模組名 import 功能1, 功能2……;功能呼叫(不需要書寫模組名,功能)
from math import sqrt
print(sqrt(9))

from……import *

·0· 語法
from 模組名 import *

# 方法三:from 模組名 import *; 功能呼叫
from math import  *
print(sqrt(9))

as定義別名

·0· 語法

# 模組定義別名
import 模組名 as 別名

# 功能定義別名
from 模組名 import 功能 as 別名

在這裡插入圖片描述

二、製作模組

在python中,每個python檔案都可以作為一個模組,模組的名字就是檔案的名字。也就是說 自定義模組名必須要符合識別符號命名規則

1 定義模組

新建一個Python檔案,命名為my_module1.py,並定義testA函式

# 需求:一個函式完成任意兩個數字加法運算
def testA(a, b):
    print(a + b)

2 測試模組

在實際開發中,當一個開發人員編寫完一個模組之後,為了讓模組能夠在專案中打到想要的效果,這個開發人員會自行在py檔案中新增一些測試資訊,例如,在my_module1.py檔案中新增測試程式碼。

# 需求:一個函式完成任意兩個數字加法運算
def testA(a, b):
    print(a + b)
testA(1, 1)

此時,無論是當前檔案,還是其他已經匯入了該模組的檔案,在執行的時候都會自動執行testA函式的呼叫。

解決方法如下:

# __name__是系統變數,是模組的識別符號,值是:如果是自身模組值是__main__,否則是當前的模組的名字
if __name__ == '__main__':
    # testA(1, 1)

3 呼叫模組

import my_module1

三、模組定位順序

當匯入一個模組,python直譯器對模組位置的搜尋順序是:

  1. 當前目錄
  2. 2.如果不在當前目錄,python則會搜尋在shell變數PYTHONPATH下的每個目錄。
  3. 如果都找不到,python會檢視預設路徑。UNIX下,預設路徑一般為/usr/local/lib/python/
    模組搜尋路徑儲存在system模組的sys.path變數中。變數裡包含當前目錄,PYTHONPATH和由安裝過程決定的預設目錄。
    ·0· 注意
    =自己的檔名不要和已有的模組名重複,否則導致模組功能無法使用
    =使用from 模組名 import 功能 的時候,如果功能名字重複, 呼叫到的是最後定義或匯入的功能。(後面定義的重名都會進行覆蓋)

四、__all__

如果一個模組檔案中有__all__變數,當使用from xx import *匯入時,只能匯入這個列表中的元素
·0· my_module2程式碼模組

# 定義多個功能,把某個功能新增到__all__
__all__ = ['testA']


def testA():
    print('testA')


def testB():
    print(testB)

·0·匯入模組的檔案程式碼

from my_module2 import *


testA()

testB()

包將有聯絡的模組組織到一起,即放到同一個資料夾下,並且在這個資料夾建立一個名字為__init__.py檔案,那麼這個資料夾就稱之為包。

一、製作包

[New]—[Python Package]—輸入包名—[OK]——新建功能模組(有聯絡的模組)。
注意:新建包後,包內部會自動建立__init__.py檔案,這個檔案控制著包的匯入行為。

二、匯入包

方法一、

Import 包名.模組名

包名.模組名.目標

# my_module1
print(1)


def info_print1():
    print('mymodule1')

# my_module2
print(2)


def info_print2():
    print('mymodule2')

# 方法一
"""
1. 匯入
import 包名.模組名
2. 呼叫功能
包名.模組名.功能()
"""

# 匯入mypackage包下的模組1,使用這個模組內的print1函式
import mypackage.my_module2
mypackage.my_module2.info_print2()

方法二、

注意:必須在__init__.py檔案中新增__all__ = [],控制允許匯入的模組列表。

from 包名 import *
模組名.目標

__all__ = ['my_module1']

# 方法二: 注意 設定__init__.py檔案裡面的all列表,新增的是允許匯入的模組
"""
from 包名 import *
模組名.目標
"""
from mypackage import *
my_module1.info_print1()

總結 模組與包

在這裡插入圖片描述

物件導向版 學員管理系統

一、 系統需求

使用物件導向程式設計思想完成學員管理系統的開發,具體如下:
·0· 系統要求:學員資料儲存在檔案中。
·0· 系統功能:新增學員、刪除學員、修改學員資訊、查詢學員資訊、顯示所有學員資訊、儲存學員資訊及退出系統等功能。

二、 準備程式檔案

1 分析
·0· 角色分析
         = 學員
         = 管理系統

工作中注意事項:

  1. 為了方便維護程式碼,一般一個角色一個程式檔案;
  2. 程式要有主程式入口,習慣為main.py

2 建立程式檔案
建立專案目錄、例如:StudentManagerSystem
程式檔案如下:
·0· 程式入口檔案:main.py
·0· 學員檔案: student.py
·0· 管理系統檔案:managerSystem.py

三、 書寫程式

1 student.py

需求:
·0· 學員資訊包含:姓名、性別、手機號;
·0· 新增__str__魔法方法,方便檢視學員物件資訊

class Student(object):
    def __init__(self, name, gender ,tel):
        # 姓名,性別,手機號
        self.name = name
        self.gender = gender
        self.tel =tel

    def __str__(self):
        return f'{self.name}, {self.gender}, {self.tel}'

2 managerSystem.py

需求:
·0·儲存資料的文職: 檔案(student.data)
         = 載入檔案資料
         = 修改資料後儲存到檔案

·0· 儲存資料的形式: 列表儲存學院物件

·0· 系統功能
         = 新增學員
         = 刪除學員
         = 修改學員
         = 查詢學員資訊
         = 顯示所有學員資訊
         = 儲存學員資訊

# 定義類
class StudentManager(object):
    def __init__(self):
        # 儲存學員資料 -- 列表
        self.student_list = []
# 學員有很多,想要一次性把學員作儲存就用列表就可以了

管理系統框架
需求: 系統功能迴圈使用,使用者輸入不同的功能序號執行不同的功能。
·0· 步驟
     = 定義程式入口函式
         @ 載入資料
         @ 顯示功能選單
         @ 使用者輸入功能序號
         @ 根據使用者輸入的功能序號執行不同的功能
     = 定義系統功能函式,新增,刪除學員等

3 main.py



# 1.匯入管理系統模組
from managerSystem import *

# 2.啟動管理系統
# 保證是當前檔案執行才啟動管理系統: if -- 建立物件並呼叫類方法(()run)
if __name__ == '__main__':
    student_manger = StudentManager()

    student_manger.run()

4 定義系統功能函式

a) 新增功能

    ·0· 需求:使用者輸入學員姓名、性別、手機號,將學院新增到系統。
    ·0· 步驟
         = 使用者輸入姓名、性別、手機號
         = 建立該學員物件
         = 將該學員物件新增到列表

# 2,2 新增學員
def add_student(self):

    # 1.使用者輸入姓名、性別、手機號
    name = input('請輸入您的姓名:')
    gender = input('請輸入您的性別:')
    tel = input('請輸入您的手機號:')
    # 2. 建立學員物件 -- 類:在student 檔案 先匯入student模組,再建立物件
    student = Student(name, gender, tel)


    # 3. 將該物件新增到學員列表
    self.student_list.append(student)

    print(self.student_list)
    print(student)

b) 刪除學員

    ·0· 需求:使用者輸入目標學員名字,如果學員在則刪除該學員。
    ·0· 步驟
         = 使用者輸入目標學員名字
         = 遍歷學員資料列表,如果使用者輸入的學員姓名存在則刪除,否則則提示該學員不存在

# 刪除學員
def del_student(self):
    # 1.使用者輸入目標學員姓名
    del_name = input('請輸入要刪除的學員姓名:')
    # 2.遍歷學員列表,如果使用者輸入的學員存在則刪除學員物件,否則提示學員不存在
    for i in self.student_list:
        if del_name == i.name:
            # 刪除該學員物件
            self.student_list.remove(i)
            break
    else:
        # 迴圈正常結束執行的程式碼:迴圈結束都沒有刪除任何一個物件,說明使用者輸入的目標學員不存在
        print('查無此人')

c) 修改學員資訊

    ·0· 需求: 使用者輸入目標學員姓名,如果學員存在則修改該學員資訊。
    ·0· 步驟
         = 使用者輸入目標學員姓名:
         = 遍歷學員資料列表,如果使用者輸入的學員姓名存在則修改學員的姓名、性別、手機號資料。否則則提示該學員不存在。

# 修改學員資訊
def modify_student(self):
    # 1.使用者輸入目標學員姓名
    modify_name = input('請輸入要修改的學員姓名')
    # 2.遍歷列表資料,如果學員存在修改姓名性別手機號,否則提示學院不存在
    for i in self.student_list:
        if modify_name == i.name:
            i.name = input('姓名:')
            i.gender = input('性別:')
            i.tel = input('手機號:')
            print(f'修改學員資訊陳宮,姓名{i.name}, 性別{i.gender}, 手機號{i.tel}')
    else:
        print('查無此人')

d) 查詢學員資訊

    ·0· 需求: 使用者輸入目標學員姓名,如果學員存在則列印該學員資訊
    ·0· 步驟:
         = 使用者輸入目標學員姓名
         = 遍歷學員資料列表,如果使用者輸入的學員姓名存在則列印學員資訊,否則提示該學員不存在。

# 查詢學員資訊
def search_student(self):
    # 1.使用者輸入目標學員姓名
    search_name = input('請輸入您要搜尋的學員姓名:')

    # 2.遍歷列表,如果學員存在列印學員資訊,否則提示學員不存在
    for i in self.student_list:
        if search_name == i.name:
            print(f'{i.name}, {i.gender}, {i.tel}')
    
    else:
        print('查無此人')

e) 顯示所有學員資訊

    ·0· 列印所有學員資訊
    ·0· 步驟
         = 遍歷學員資料列表,列印所有學員資訊

顯示所有學員資訊
def show_student(self):
    # 1. 列印表頭
    print('姓名\t性別\t手機號')
    # 2. 列印學員資料
    for i in self.student_list:
        print(f'{i.name}\t{i.gender}\t{i.tel}')

f) 儲存學員資訊

    ·0· 需求: 將修改後的學員資料儲存到儲存資料的檔案
    ·0· 步驟
         = 開啟檔案
         = 檔案寫入資料
         = 關閉檔案
思考:

  1. 檔案寫入的資料是學員物件的記憶體地址嗎?
    將來寫入的時候列表裡面需要的是字典資料,所以利用__dict__轉換成為一個字典
  2. 檔案內資料要求的型別是什麼?
儲存學員資訊
def save_seudent(self):
    # 1. 開啟檔案
    f = open('student.data', 'w')

    # 2.檔案寫入資料
    # 2.1 [學員物件]轉換成[字典]
    new_list = [i.__dict__ for i in self.student_list]
    # 2.2 檔案寫入字串資料
    f.write(str(new_list))

    # 3.關閉檔案
    f.close()

g) 擴充 __dict__

# 1. 定義類
class A(object):
    a = 0

    def __init__(self):
        self.b = 1

# 2. 建立物件
aa = A()

# 3.呼叫__dict__
# 返回類內部所有屬性和方法對應的字典
print(A.__dict__)
# 返回例項屬性和值組成的字典
print(aa.__dict__)

h) 載入學員資訊

    ·0· 需求: 每次進入系統後,修改的資料是檔案裡面的資料
    ·0· 步驟
         = 嘗試以”r”模式開啟學員資料檔案,如果檔案不存在則以”w”模式開啟檔案
         = 如果檔案存在則讀取資料並儲存資料
             @ 讀取資料
             @ 轉換資料型別為列表並轉換列表內的字典為物件
             @ 儲存學員資料到學員列表
         = 關閉檔案

# 載入學員資訊
def load_student(self):
    # 1. 開啟檔案: 嘗試r開啟,如果有異常w
    try:
        f = open('student.data', 'r')
    except:
        f = open('student.data', 'w')
    else:
        # 2. 讀取資料: 檔案讀取出的資料是字串還原列表型別:[{}] 轉換[學院物件]
        data = f.read() # 字串
        new_list = eval(data)
        self.student_list = [Student(i['namne'], i['gender'], i['tel']) for i in new_list]
    finally:
        # 3. 關閉檔案
        f.close()

5 程式碼總合

1 ·0· student

class Student(object):
    def __init__(self, name, gender ,tel):
        # 姓名,性別,手機號
        self.name = name
        self.gender = gender
        self.tel =tel

    def __str__(self):
        return f'{self.name}, {self.gender}, {self.tel}'

2 ·0· managerSystem


from student import *
class StudentManager(object):
    def __init__(self):
        # 儲存學員資料 -- 列表
        self.student_list = []

    # 一、程式入口函式
    def run(self):
        # 1.載入檔案裡面的學員資料
        self.load_student()
        while True:

            # 2.顯示功能選單
            self.show_menu()
            # 3.使用者輸入目標功能序號
            menu_num = int(input('請輸入您需要的功能序號'))

            # 4.根據使用者輸入的序號執行不同的功能    --  如果使用者輸入1,執行新增
            if menu_num == 1:
                # 新增學員
                self.add_student()
            elif menu_num == 2:
                # 刪除學員
                self.del_student()
            elif menu_num == 3:
                # 修改學員資訊
                self.modify_student()
            elif menu_num == 4:
                # 查詢學員資訊
                self.search_student()
            elif menu_num == 5:
                # 顯示所有學員資訊
                self.show_student()
            elif menu_num == 6:
                # 儲存學員資訊
                self.save_seudent()
            elif menu_num == 7:
                # 退出系統 -- 退出迴圈
                break

    # 二、系統功能函式
    # 2.1 顯示功能選單    --  列印序號的動能對應關係 -- 靜態
    @staticmethod
    def show_menu():
        print('請選擇如下功能')
        print('1:新增學員')
        print('2:刪除學員')
        print('3:修改學員資訊')
        print('4:查詢學員資訊')
        print('5:顯示所有學員資訊')
        print('6:儲存學員資訊')
        print('7:退出系統')

    # 2,2 新增學員
    def add_student(self):

        # 1.使用者輸入姓名、性別、手機號
        name = input('請輸入您的姓名:')
        gender = input('請輸入您的性別:')
        tel = input('請輸入您的手機號:')
        # 2. 建立學員物件 -- 類:在student 檔案 先匯入student模組,再建立物件
        student = Student(name, gender, tel)


        # 3. 將該物件新增到學員列表
        self.student_list.append(student)

        print(self.student_list)
        print(student)

    # 2.3 刪除學員
    def del_student(self):
        # 1.使用者輸入目標學員姓名
        del_name = input('請輸入要刪除的學員姓名:')
        # 2.遍歷學員列表,如果使用者輸入的學員存在則刪除學員物件,否則提示學員不存在
        for i in self.student_list:
            if del_name == i.name:
                # 刪除該學員物件
                self.student_list.remove(i)
                break
        else:
            # 迴圈正常結束執行的程式碼:迴圈結束都沒有刪除任何一個物件,說明使用者輸入的目標學員不存在
            print('查無此人')

        # 3.

    # 2.4 修改學員資訊
    def modify_student(self):
        # 1.使用者輸入目標學員姓名
        modify_name = input('請輸入要修改的學員姓名')
        # 2.遍歷列表資料,如果學員存在修改姓名性別手機號,否則提示學院不存在
        for i in self.student_list:
            if modify_name == i.name:
                i.name = input('姓名:')
                i.gender = input('性別:')
                i.tel = input('手機號:')
                print(f'修改學員資訊陳宮,姓名{i.name}, 性別{i.gender}, 手機號{i.tel}')
        else:
            print('查無此人')

    # 2.5 查詢學員資訊
    def search_student(self):
        # 1.使用者輸入目標學員姓名
        search_name = input('請輸入您要搜尋的學員姓名:')

        # 2.遍歷列表,如果學員存在列印學員資訊,否則提示學員不存在
        for i in self.student_list:
            if search_name == i.name:
                print(f'{i.name}, {i.gender}, {i.tel}')

        else:
            print('查無此人')

    # 2.6 顯示所有學員資訊
    def show_student(self):
        # 1. 列印表頭
        print('姓名\t性別\t手機號')
        # 2. 列印學員資料
        for i in self.student_list:
            print(f'{i.name}\t{i.gender}\t{i.tel}')

    # 2.7 儲存學員資訊
    def save_seudent(self):
        # 1. 開啟檔案
        f = open('student.data', 'w')

        # 2.檔案寫入資料
        # 2.1 [學員物件]轉換成[字典]
        new_list = [i.__dict__ for i in self.student_list]
        # 2.2 檔案寫入字串資料
        f.write(str(new_list))

        # 3.關閉檔案
        f.close()

    # 2.8 載入學員資訊
    def load_student(self):
        # 1. 開啟檔案: 嘗試r開啟,如果有異常w
        try:
            f = open('student.data', 'r')
        except:
            f = open('student.data', 'w')
        else:
            # 2. 讀取資料: 檔案讀取出的資料是字串還原列表型別:[{}] 轉換[學院物件]
            data = f.read() # 字串
            new_list = eval(data)
            self.student_list = [Student(i['namne'], i['gender'], i['tel']) for i in new_list]
        finally:
            # 3. 關閉檔案
            f.close()


3 ·0·main


# 1.匯入管理系統模組
from managerSystem import *

# 2.啟動管理系統
# 保證是當前檔案執行才啟動管理系統: if -- 建立物件並呼叫類方法(()run)
if __name__ == '__main__':
    student_manger = StudentManager()

    student_manger.run()

相關文章