1. 程式人生 > 其它 >設計模式與pickle模組

設計模式與pickle模組

設計模式

設計模式的定義

  設計模式其實就是程式設計師前輩多次驗證過的用語處理固定問題的固定方法。

設計模式

  設計模式共有23種。大致可以分為三種類型

  • 建立型
  • 結構型
  • 行為型

設計模式之單例模式

  單例模式其實是指一個類只產生一個物件。這樣的模式的目的是為了節省記憶體資源。單例模式可以應用於以下兩種情況

  • 類中有很多繫結給物件的方法,而且這些方法都比較牛
  • 在拿到一個新的類的時候,不確定這個類是否已經產生了物件。如果已經產生過物件的情況下在產生一個新的物件就會造成記憶體的資源的浪費

單例模式對物件例項化的影響

  在物件例項化的過程中完成單例模式的方式有很多種。

基於元類的單例模式

      class Myclass(type):
          def __call__(self, *args, **kwargs):
              if not hasattr(self, 'instance'):  # 判斷類內有沒有名為instance的資料或方法
                  self.instance = super().__call__(*args, **kwargs)  # 沒有的時候新增
              return self.instance  # 有的時候

      class Single_Calss(metaclass=Myclass):
          def __init__(self, name):
              self.name = name

      obj1 = Single_Calss('oliver')
      obj2 = Single_Calss('kevin')
      print(obj1)  # <__main__.Single_Calss object at 0x000002A639C6CD30>
      print(obj2)  # <__main__.Single_Calss object at 0x000002A639C6CD30>
      print(obj1.__dict__)  # {'name': 'oliver'}
      print(obj2.__dict__)  # {'name': 'oliver'}

基於classmethod的單例模式

      class Myclass(object):
          _instance = None

          def __init__(self, name, gender):
              self.name = name
              self.gender = gender

          @classmethod
          def single(cls):
              if not cls._instance:  # 判斷類名稱空間內部是否存在個性資料
                  cls._instance = Myclass('name', 'gender')
              return cls._instance


      obj1 = Myclass.single()
      obj2 = Myclass.single()
      print(obj1)  # <__main__.Myclass object at 0x0000025955B9CE10>
      print(obj2)  # <__main__.Myclass object at 0x0000025955B9CE10>

      print(obj1.name)  # name
      print(obj1.gender)  # gender

基於__new__方法的單例模式

      class Mysql(object):
          _instance = None

          def __init__(self, name):
              self.name = name

          def __new__(cls, *args, **kwargs):
              if not cls._instance:
                  cls._instance = object.__new__(cls)
              return cls._instance


      obj = Mysql('egon')
      obj1 = Mysql('jason')
      print(id(obj), id(obj1))

pickle模組

  pickle模組的學習主要是為了教育管理系統的編寫,後期ORM學習之後,pickle模組就用不到了。pickle模組是針對python的模組。pickle模組的主要作用就是能夠將物件儲存到檔案裡,並且取出之後物件其中的資料與方法還可以使用

      import pickle

      class Myclass(object):
          def __init__(self, name, age, gender):
              self.name = name
              self.age = age
              self.gender = gender

          def func_name(self):
              print('物件裡的方法')


      obj1 = Myclass('oliver', 25, 'male')
      print(obj1.__dict__)

      with open(r'%s'% obj1.name, 'w', encoding='utf8') as f:
          json.dump(obj1, f)  #TypeError: Object of type 'Myclass' is not JSON serializable


      with open(r'%s.txt' % obj1.name, 'wb') as f:
          pickle.dump(obj1, f)


      with open(r'%s.txt' % obj1.name, 'rb') as f:
          res = pickle.load(f)
      print(res.__dict__)  # {'name': 'oliver', 'age': 25, 'gender': 'male'}
      res.func_name()  # 物件裡的方法