【八月】设计模式、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.若存在则返回空
浙公网安备 33010602011771号