Python面向对象之设计模式、pickle模块

设计模式

设计模式即前辈们发明的、经过反复验证用于解决固定问题的固定套路

设计模式的类型

在IT行业中设计模式总共有23种,可以分为三大类

  1. 创建型
  2. 结构型
  3. 行为型

单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

# 类加括号调用多次只允许产生一个对象
>>> class MyClass:
...     pass
...
>>>
>>> obj1 = MyClass()
>>> obj2 = MyClass()
>>> obj3 = MyClass()
>>> print(id(obj1), id(obj2), id(obj3))
2142505501840 2142504564480 2142505501744
"""正常情况下 类名只要加括号实例化产生对象 执行几次就会产生几个不同的对象"""

若不希望类频繁的产生不同的对象,多个地方需要使用,为节省空间,我们可以使用单例

'''使用元类干预对象的创建过程'''
>>> class MyMeTaClass(type):
...     # 记录类是否已经创建了对象
...     instance = None
...     def __call__(self, *args, **kwargs):
...         if self.instance:
...             return self.instance
...         # 获取空对象
...         obj = super().__call__(*args, **kwargs)
...         # 保存对象
...         self.instance = obj
...         # 返回空对象
...         return obj
...
>>>
>>> class Single(metaclass=MyMeTaClass):
...     def __init__(self, name):
...         self.name = name
...
>>>
>>> obj1 = Single('jason')
>>> obj2 = Single('kevin')
>>> obj3 = Single('tony')
>>> print(id(obj1), id(obj2), id(obj3))
2142508386912 2142508386912 2142508386912
>>> print(obj1.name)
jason
>>> print(obj2.name)
jason
>>> print(obj3.name)
jason

pickle模块

pickle 是 python 语言的一个标准模块,安装 python 的同时就已经安装了 pickle 库,因此它不需要再单独安装,使用 import 将其导入到程序中,就可以直接使用。

主要方法

函数 描述
dumps() 将 Python 中的对象序列化成二进制对象,并返回
loads() 读取给定的二进制对象数据,并将其转换为 Python 对象
dump() 将 Python 中的对象序列化成二进制对象,并写入文件
load() 读取指定的序列化数据文件,并返回对象
  • dumps 和 loads 实现基于内存的 Python 对象与二进制互转
  • dump 和 load 实现基于文件的 Python 对象与二进制互转

与 json 模块的区别

pickle 模块与 json 模块很像,都是用来做序列化,反序列化的
并且pickle模块支持python所有数据类型。

区别

  • json 是一个文本序列化格式,而 pickle 是一个二进制序列化格式
  • json 是我们可以直观阅读的,而 pickle 不可以
  • json 是可互操作的,在 Python 系统之外广泛使用,而 pickle 则是 Python 专用的
  • 默认情况下,json 只能表示 Python 内置类型的子集,不能表示自定义的类;但 pickle 可以表示大量的 Python 数据类型

使用(例)

import pickle


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

    def choice_course(self):
        print('%s正在选课' % self.name)


obj = MyClass('jason')
# 需求:将对象保存到文件 并且将来取出之后*还可以通过句点符随意调用
# with open(r'35.txt','w',encoding='utf8') as f:
#     f.write(obj)  # 报错,常规的文件操作不行
# import json
# with open(r'35.txt','w',encoding='utf8') as f:
#     f.write(json.dumps(obj))  # 报错,json模块也不行


with open(r'35.txt', 'wb') as f:
    f.write(pickle.dumps(obj))  # 可以写入,二进制模式  ��.       �__main__��MyClass���)��}��name��jason�sb.
    # pickle.dump(obj, f)  # 两种写入方法

with open(r'35.txt', 'rb') as f:
    data = pickle.load(f)
    
print(data)  # <__main__.MyClass object at 0x0000025C6A0DBF70>
print(data.name)  # jason
data.choice_course()  # jason正在选课

作业

选课系统项目

描述选课系统管理员注册功能完整逻辑:


功能展示层(admin_view.py)

  1. 获取管理员数据(用户名、密码)

  2. 调用接口,传值

  3. 接收返回值,打印管理员注册功能反馈信息

核心逻辑层(admin_interface.py)

  1. 调用数据处理层的方法,判断用户对象是否存在、传入数据保存对象

  2. 返回信息

数据处理层(db_hanlder.py、 model.py)

  1. 接收传过来的数据

  2. 创建对象,调用db_handler.py中相应的功能方法(查找是否存在),将对象传入db_handler.py,判断用户是否存在

  3. 若不存在,则调用db_handler.py中相应的功能方法(存用户数据),将对象传入db_handler.py,保存用户对象数据

  4. 返回该对象(若用户存在则返回空)

posted @ 2022-08-01 17:31  梦想有双休  阅读(61)  评论(0)    收藏  举报