一、面向对象——单例模式代码实操
方法有很多,其实就是定制产生类,或者产生对象
1.基于双下new,控制实例化对象的条件
class MyClass:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self, name, age):
self.name = name
self.age = age
a = MyClass('jack', 88)
b = MyClass('tom', 66)
print(id(a), id(b))
2.利用元类,元类是用于创建类对象的类,类对象创建实例对象时一定会调用双下call方法,因此控制双下call始终只创建一个实例即可
class Singleton(type):
def __call__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super().__call__(*args, **kwargs)
return cls._instance
class A(metaclass=Singleton):
pass
foo1 = A()
foo2 = A()
print(id(foo1), id(foo2))
>>>
2528927388480 2528927388480
3.基于模块的单例,创一个类,把这个类的文件当作模块,导模块,导了一次就不会再导,所以一定就只有一个对象
class C1:
def __init__(self, name):
self.name = name
obj = C1('jason')
——————————————————————————————————————
在别的文件导一下创这个类的文件(导模块嘛),不管别的文件点多少次,对象不会变
二、pickle序列化模块
和我们前一阵学的json类似,都是序列化数据用来存取,能够实现任意对象与文本之间的相互转化,四种表达用法也是和json一致
与json的区别:
1.pickle转都是对象与二进制之间的转化
2.json序列化后是字符串,pickle序列化后是字节类型
3.json(文本转换形式下)转换后的数据我们看得懂,pickle是完全看不懂
4.json打开被序列化文件以文本形式打开,而pickle只能以二进制模式打开
5.json通吃很多编程语言,而pickle离开Python就不行
6.pickle序列化对象后,可以直接在当前py文件下用句点符访问到名称空间
class C1:
def __init__(self, name, age):
self.name = name
self.age = age
def func1(self):
print('来自 func1')
def func2(self):
print('来自 func2')
obj = C1('jack', 28)
import pickle
with open(r'a.txt', 'wb') as f:
pickle.dump(obj, f)
with open(r'a.txt', 'rb') as f:
info = pickle.load(f)
print(info)
info.func1()
info.func2()
print(info.name)
>>>
<__main__.C1 object at 0x000001C2A8D06EE0>
from func1
from func2
jack
三、选课系统需求分析
选课系统
角色:学校、学员、课程、讲师
# 一种事物可以分出好多事物,就可以使用面向对象
# 小的事物就是一个个对象
要求:
1. 创建北京、上海 2 所学校
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
3. 课程包含,周期,价格,通过学校创建课程
4. 通过学校创建班级, 班级关联课程、讲师5. 创建学员时,选择学校,关联班级
5. 创建讲师角色时要关联学校,
6. 提供三个角色接口
6.1 学员视图, 可以注册, 交学费, 选择班级,
6.2 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩
6.3 管理视图,创建讲师, 创建班级,创建课程
7. 上面的操作产生的数据都通过pickle序列化保存到文件里
四、选课系统架构设计
其实还是前一阵写ATM系统的三层框架,但是start.py不存在bin里而是放在根目录,第三层数据层新增一个模块models用来存放所有的类,如果要调用数据做事情得先经过models(其实是强行加的用来练习对面向对象的熟练程度)
大框架还是第一层是用户视图层,不过为了让这个系统真的像个正儿八经的系统,第一层只展示不同身份的用户的视觉界面,选啥系统再对接到啥接口层上去
标签:__,序列化,name,选课,python,self,设计模式,pickle,cls From: https://www.cnblogs.com/wznn125ml/p/16874873.html