2022.4.12設計模式與pickle模組及選課系統專案
阿新 • • 發佈:2022-04-12
2022.4.12設計模式與pickle模組及選課系統專案
- 昨日作業講解
- 設計模式
- pickle模組
- 選課系統專案分析
- 選課系統架構搭建
一、昨日作業講解
需求:編寫元類規定物件的所有資料值轉大寫
eg:
obj.name = 'jason'
print(obj.name) # JASON
分析:我們的需求是物件的資料值轉大寫,因此需要干涉元類的資料產生,我們知道雙下init之前執行的是元類的雙下call,因此我們可以在新增資料之前在元類多做一步操作,將傳入的資料轉為大寫
class MyTypeClass(type): def __call__(self, *args, **kwargs): args = [i.upper() for i in args] # for迴圈元組args然後轉大寫再賦值給args return super().__call__(*args, **kwargs) class MyClass(metaclass=MyTypeClass): def __init__(self, name, gender): self.name = name self.gender = gender def __setattr__(self, key, value): self.__dict__[key] = value.upper() obj = MyClass('jason', 'male') print(obj.name) # JAOSON print(obj.gender) # MALE obj.hobby = 'jdb' print(obj.hobby) # JAB
二、設計模式
1、來由
設計模式:是前輩們發明的經過反覆驗證用於解決固定問題的固定套路
2、型別
在IT行業中設計模式總共有23種,可以分為三大類
1.建立型
2.結構型
3.行為型
3、設計模式呢之單例模式(23種之一)
單例模式:是指一個類只能產生一個物件,用於節省資源
應用場景:有一個類中有很多非常厲害的繫結給物件的方法,需要在很多地方使用,不同人來用不知道有沒有產生物件,所以自己會建立一個新物件,如此往復會造成資源的浪費,因此單例模式應運而生
如何實現:在類例項化物件的時候干涉>>>元類
注意:單例模式有很多編寫方式,這裡展示一種:
class Single(type): new_obj = None # 設定一個標誌,產生過物件則該改變 def __call__(self,*args,**kwargs): if not self.new_obj: # 判斷標誌不為空時 obj = super().__call__(*args,**kwargs) # 獲取雙下call的返回值 self.new_obj = obj # 將返回值賦值給new_obj,便於下面獲取已經獲取過一次的物件值 return self.new_obj return self.new_obj # 已經產生物件,使用產生過的一個物件 class MyClass(metaclass=Single): def __init__(self,name): self.name = name obj1 = MyClass('jason') obj2 = MyClass('tony') print(obj1.__dict__,obj2.__dict__) # {'name':'jason'} {'name':'jason'}
單例的實現方式不固定,還有很多種,可以訪問下面網站了解:
https://www.cnblogs.com/Dominic-Ji/p/10525994.html
三、pickle模組
學習該模組的目的僅僅是為了子啊選課系統中使用,後期會學習ORM就不會用pickle了,因為該模組只支援python,相容性很差!
那麼問題來了,pickle模組有哪些用處呢?看下面需求,舉個例子
需求:將物件儲存到檔案 並且取出來之後還可以使用物件的功能
分析:從我們目前學習的內容來看,基本上沒有能將物件存入檔案還能保證物件的名稱空間內容不丟失的,因此,需要用到pickle模組
import pickle # 呼叫pickle模組 class MyClass(object): # 定義一個簡單的類 school = 'school' def __init__(self, name): self.name = name def choose_course(self): print('%s正在選課'%self.name) obj = MyClass('jason') # 產生一個物件 print(obj.school) obj.choose_course() with open(r'%s'%obj.name,'wb') as f: # 存入檔案 pickle.dump(obj, f) with open(r'jason','rb') as f: # 獲取檔案內容 data = pickle.load(f) print(data) # {'name':'jason'} print(data.name) # jason 特別注意:pickle產生的檔案只有在原來產生物件的類存在時才能正常使用,因此一般獲取到的pickle物件儲存的資料都是在程式碼執行時臨時存在的,如果沒有原來的程式碼,那麼光有這個檔案是使用不了裡面的物件的
四、選課系統專案分析
目的:練習面向物件程式設計
專案需求:
選課系統
角色:學校、學員、課程、講師
要求:
1. 建立北京、上海 2 所學校
2. 建立linux , python , go 3個課程 , linux\py 在北京開, go 在上海開
3. 課程包含,週期,價格,通過學校建立課程
4. 通過學校建立班級, 班級關聯課程、講師
5. 建立學員時,選擇學校,關聯班級
5. 建立講師角色時要關聯學校,
6. 提供三個角色介面
6.1 學員檢視, 可以登入,註冊, 選擇學校,選擇課程,檢視成績
6.2 講師檢視, 講師登入,選擇學校,選擇課程, 檢視課程下學員列表 , 修改所管理的學員的成績
6.3 管理檢視,登入,註冊,建立講師, 建立班級,建立課程,建立學校
7. 上面的操作產生的資料都通過pickle序列化儲存到檔案裡
1、架構設計
三層架構:
展示層:管理員檢視、學生檢視、講師檢視
後臺核心程式:管理員功能、學生功能、講師功能
資料層:
models.by(存放所有角色的類)、
db_hanlter(用於存取資料)、
不同型別資料資料夾(管理員、講師、學生)
2、專案功能分析
為了減輕複雜度,班級直接等同於課程(不影響學習)
功能展示及架構關係:
# 管理員檢視 >>> 管理員功能
註冊 >>> 註冊功能 >>> 存入管理員檔案
登入 >>> 登入功能 >>> 獲取管理員檔案比對
建立學校 >>> 建立學習功能
建立課程 >>> 建立課程功能
建立講師 >>> 建立講師功能
# 講師檢視 >>> 講師功能
登入 >>> 登入功能 >>> 管理員檔案
檢視教授課程 >>> 檢視教授課程功能
選擇教授課程 >>> 選擇教授課程功能
檢視課程學生 >>> 檢視課程功能
評判學生分數 >>> 評判學生分數功能
# 學員檢視 >>> 學員功能
註冊 >>> 註冊功能 >>> 存入管理員檔案
登入 >>> 登入功能 >>> 獲取管理員檔案比對
選擇學校 >>> 選擇學校功能
選擇課程 >>> 選擇課程功能
檢視分數 >>> 檢視分數功能
3、專案目錄搭建(結合軟體開發目錄規範)
start.py
conf >>> settings.py
core >>> src.py
interface >>>
admin_interface.py
teach_interface.py
student_interface.py
db >>>
models.py
db_handlter.py
admin >>> ...(管理員資料)
teach >>> ...(講師資料)
student >>> ...(學生資料)
log >>> scy.log(日誌檔案)
4、專案功能搭建
# src.py
def run():
while True: # 初始介面
print('''
1.管理員檢視
2.講師檢視
3.學員檢視
''')
...
def admin():
while True: # 管理員檢視
print('''
1.註冊
2.登入
3.建立學校
4.建立課程
5.建立講師
''')
...
def teach():
while True: # 講師檢視
print('''
1.註冊
2.登入
2.檢視教授課程
3.選擇教授課程
4.檢視課程學生
5.評判學生分數
''')
...
def student():
while True: # 學員檢視
print('''
1.註冊
2.登入
3.選擇學校
4.選擇課程
5.檢視分數
''')
...
# admin_interface.py
def run():
pass
# teach_interface.py
def run():
pass
# student_interface.py
def run():
pass
# db,models.py
class Admin: # 管理員物件
def __init__(self,name,pwd)
self.name = name
self.pwd = pwd
...
class Teach: # 講師物件
def __init__(self,name,pwd)
self.name = name
self.pwd = pwd
...
class Student: # 學員物件
def __init__(self,name,pwd)
self.name = name
self.pwd = pwd
...
# db,db_handlter
def save(obj): # 儲存物件
pass
def select(name): # 獲取儲存的物件
pass
5、資料儲存要點注意
類產生的物件在儲存的時候
自動建立一個與類名一樣的資料夾名 將資料儲存到該資料夾內
# 如何通過物件獲取類對應的字串名稱
obj = Admin('jason',123)
# 固定方法
print(obj.__class__) # <class '__main__.Admin'> 類名
print(obj.__class__.__name__) # Admin 字串