1. 程式人生 > 其它 >python設計模式和選課系統

python設計模式和選課系統

python設計模式和選課系統

設計模式

# 設計模式的定義:
設計模式是前輩們經過相當長的一段時間的試驗和錯誤總結出來的最佳實踐
設計模式是前輩們發明的經過反覆驗證用於解決固定問題的固定套路

#在IT行業中設計模式總共有23種 可以分為三大類
  1.建立型
  2.結構型
  3.行為型
    
#常見的模式:
工廠模式、抽象工廠模式、單例模式、建造者模式、原型模式、介面卡模式、橋接模式、過濾器模式、策略模式等

設計模式之單例模式

# 單例模式:
單例模式是一個類只能產生一個物件  用於節省資源

#應用常場景:
有一個類中有很多非常牛逼的繫結給物件的方法
    我們需要在很多地方使用它 那麼不同的程式設計師來用不知道有沒有產生物件
    所以自己會建立一個新物件 如此往復則會造成資源的浪費
    
# 程式碼示例:
class Single(type):
      new_obj = None
      def __call__(self, *args, **kwargs):
          if not self.new_obj:
              obj = super().__call__(*args, **kwargs)
              self.new_obj = 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(id(obj1), id(obj2))
    print(obj1.__dict__,obj2.__dict__)
    
'''實現單例模式的方式有很多 也有基於classmethod、裝飾器、元類、__new__、模組 '''

設計模式之工廠模式

'''每個工廠負責生產自己工廠的水果即可,避免了在新增產品時需要修改工廠的程式碼 '''

# 程式碼示例:
class Orange(object):
    print('橘子')

class Func_Factors():

    def get_fruit(fruit_name):
        if fruit_name == 'a':
            return Apple()
        elif fruit_name == 'b':
            return Banana()
        elif fruit_name == 'c':
            return Orange()
        else:
            return '沒有水果'


aaa = Func_Factors.get_fruit('a')
bbb = Func_Factors.get_fruit('b')
ccc = Func_Factors.get_fruit('c')

pickle模組

# pickle模組
該pickle模組實現了用於序列化和反序列化Python物件結構的二進位制協議

“Pickling”是將Python物件層次結構轉換為位元組流的過程, “unpickling”是反向操作,從而將位元組流(來自二進位制檔案或類似位元組的物件)轉換回物件層次結構

pickle模組對於錯誤或惡意構造的資料是不安全的。

#pickle和json 的區別:

  1. JSON是一種文字序列化格式(它輸出unicode文字,雖然大部分時間它被編碼utf-8),而pickle是二進位制序列化格式;

  2. JSON是人類可讀的,而pickle則不是;

  3. JSON是可互操作的,並且在Python生態系統之外廣泛使用,而pickle是特定於Python的;
    
# 程式碼示例:
import 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()

# pickle可以
# 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)
print(data.name)
print(data.school)

'''由於json無法儲存物件型別 該模組的目的僅僅是為了在選課系統中使用 後期會學習ORM就不會用pickle了'''


選課系統

選課系統專案分析

#專案分析:	
    選課系統
		角色:學校、學員、課程、講師
		要求:
      1. 建立北京、上海 2 所學校
      2. 建立linux , python , go 3個課程 , linux\py 在北京開, go 在上海開
      3. 課程包含,週期,價格,通過學校建立課程
      4. 通過學校建立班級, 班級關聯課程、講師
      5. 建立學員時,選擇學校,關聯班級
      5. 建立講師角色時要關聯學校,
      6. 提供三個角色介面
          6.1 學員檢視, 可以登入,註冊, 選擇學校,選擇課程,檢視成績
          6.2 講師檢視, 講師登入,選擇學校,選擇課程, 檢視課程下學員列表 , 修改所管理的學員的成績
          6.3 管理檢視,登入,註冊,建立講師, 建立班級,建立課程,建立學校
      7. 上面的操作產生的資料都通過pickle序列化儲存到檔案裡
    

選課系統專案功能分析

#管理員檢視
	註冊
  登入
  建立學校
  建立課程
  建立講師
  	...
#講師檢視
	登入
  檢視教授課程
  選擇教授課程
  檢視課程學生
  評判學生分數
	...
#學員檢視
	註冊
    登入
  選擇學校
  選擇課程
  檢視分數
    ...

專案目錄的搭建

資料儲存的分析

儲存資料

def save(obj):
    file_path = os.path.join(settings.DB_DIR, obj.__class__.__name__)

    if not os.path.exists(file_path):
        os.mkdir(file_path)
    wenjian_path = os.path.join(file_path, obj.username)
    with open(wenjian_path,'wb')as f:
        pickle.dump(obj, f)

判斷使用者是否存在

def get_obj(cls, username):
    file_path = os.path.join(settings.DB_DIR, cls.__name__,username)
    if os.path.exists(file_path):
        with open(file_path,'rb')as f:
            obj = pickle.load(f)
            return obj

建立與類名一樣的資料夾

類產生的物件在儲存的時候	
	自動建立一個與類名一樣的資料夾名 將資料儲存到該資料夾內

# 如何通過物件獲取類對應的字串名稱
obj = Admin('jason',123)
# 固定方法
print(obj.__class__)  # <class '__main__.Admin'>    類名
print(obj.__class__.__name__)  # Admin              字串