【八月】设计模式、pickle模块

前期提要

魔法方法

双下方法 触发条件
_init_ 对象或类实例化时自动触发
_str_ 被打印时自动触发
_call_ 对象或类加括号时自动触发
_del_ 对象或类销毁时自动触发
_getattr_ 通过句点符获取不存在的属性时自动触发
_getattribute_ 通过句点符获取属性时自动触发
_setattr_ 操作对象属性时自动触发
_enter_ with开始时自动触发 返回值赋值给as后面的变量名
_exit_ with结束时自动触发
_new_ 对象生成时自动触发

元类

元类:产生类的类

自定义元类

class MyMetaClass(type):
    pass

class MyClass(metaclass=MymetaClass):  # 需要通过关键字传参的形式 才能自定义元类
    pass

元类的作用

用于高度定制对象或类的行为

_init_ 定制类的行为
_call_ 定制对象的行为

class MyMetaClass(type):
    def __call__(self, *args, **kwargs):
        print(args)
        print(kwargs)
        super().__call__(*args, **kwargs)
    def __init__(cls, what, bases=None, dict=None):
        print(what)
        print(bases)
        print(dict)
        if what.isupper():
            raise Exception('不能纯大写')
        super().__init__(what, bases, dict)
    pass


class MyClass(metaclass=MyMetaClass):
    def __init__(self, *args, **kwargs):
        pass


obj = MyClass(1, 2, 3)

# 运行结果
# MyClass
# ()
# {'__module__': '__main__', '__qualname__': 'MyClass', '__init__': <function MyClass.__init__ at 0x00000227422280D0>}
# (1, 2, 3)
# {}

今日内容

设计模式

设计模式是什么

IT行业的老前辈针对固定问题提出的固定解决方案

设计模式的分类

创业型 结构型 行为型

设计模式单例模式

class MyMetaClass(type):
    instance = none  # 记录是否已创建一个对象 用于存储已存在的唯一的对象
    def __call__(self, *args, **kwargs):  # 控制类的产生
        if instance:  # 若已存在 返回该对象
            return self.instance
        obj = super().__call__(*args, **kwargs)  # 不存在则创建一个新的对象
        self.instance = obj  # 使用instance记录该对象
        return obj

pickle模块

与json模块类似 都用于序列化

优势:支持python所有的类型数据 包括对象
劣势:只能在python与python之间使用 兼容性差

pickle模块的使用

import pickle
class MyClass:
    name = 'myclass_obj'

obj = MyClass()

with open(r'a.txt', 'wb') as f:
    pickle.dump(obj, f)  # 保存对象  和json很像

with open(r'a.txt', 'rb') as f:
    obj1 = pickle.load(f)  # 获取存储好的对象

print(obj1.name)  # myclass_obj

作业

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

1.获取用户输入
    1.1.获取用户名、密码、确认密码
    1.2.确认两次密码是否一致
    1.3.调用注册接口
2.注册接口
    2.1.将用户名和密码放到models中判断用户对象是否存在
    2.2.返回信息
3.models.py
    3.1.获取用户名和密码
    3.2.创建对象去db_handler中判断用户是否存在
    3.3.若不存在则将对象传入db_hanlder中保存对象数据 并返回该对象
    3.4.若存在则返回空

posted on 2022-08-01 16:11  祁珏  阅读(102)  评论(0)    收藏  举报

导航