单例模式实现的多种方法
方式1:使用类
class C1:
__instance = None
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
# 使用装饰器,让类加括号调用的时候也可以省略一个参数
def singleton(cls):
# 判断cls(也就是self)有没有这个属性,也就是判断之前内部有没有创建出__instance这个对象,如果有了就直接把他返回出去,如果没有就根据设定的参数创建一个
if not cls.__instance:
cls.__instance = cls('jason', 18)
return cls.__instance
# 这里的意思如果不传参数产生新的对象,始终调用的是同一个对象
obj1 = C1.singleton()
obj2 = C1.singleton()
obj3 = C1.singleton()
print(id(obj1), id(obj2), id(obj3))
obj4 = C1('kevin', 28)
obj5 = C1('tony', 38)
print(id(obj4), id(obj5))
方式2:使用metaclass方式(自定义元类)
class Mymeta(type):
def __init__(self, name, bases, dic): # 定义Mysq1时触发
# 事先从配置文件中取配置来造一个Mysql的实例(创建类的时候就给这个类创建一个默认对象)
self.__instance = object.__new__(self) # 产生对象
self.__init__(self.__instance, 'jason', 18) # 初始化对象
# 上述两步可以合成下面一步
# self.__instance=super().__call__(*args, **kwargs)
# 这里就是用type的代码生成新的类
super().__init__(name, bases, dic)
def __call__(self, *args, **kwargs): # Mysq1(...)时触发
# 当类定义好了之后,被用来创建对象的时候就会触发call,如果没有传参就直接返回之前创建类时定义的默认对象,如果有参数就会生成新的对象返回出去
if args or kwargs: # args或kwargs内有值
obj = object.__new__(self)
self.__init__(obj, *args, **kwargs)
return obj
return self.__instance
class Mysq1(metaclass=Mymeta):
def __init__(self, name, age):
self.name = name
self.age = age
# 这里的思路和上面的相似,如果不传参数产生新的对象,始终调用的是同一个对象
obj1 = Mysq1()
obj2 = Mysq1()
print(id(obj1), id(obj2))
obj3 = Mysq1('tony', 321)
obj4 = Mysq1('kevin', 222)
print(id(obj3), id(obj4))
方法3:自定义双下new
# 类加括号无论执行多少次永远只会产生一个对象
class Singleton:
def __new__(self, *args, **kwargs):
if not hasattr(self, '_instance'):
self._instance = super(Singleton_, self).__new__(self)
# 通过今天的学习得知双下new是产生对象的方法,因此我们在这里进行派生操作,
# 用hasatter检测当前类是否已经有创建过对象,如果没有就新建一个(使用super拿元类的双下new直接创建),如果有就返回有的哪个对象
a = Singleton_()
b = Singleton_()
print(a)
print(b)
方法4:基于模块的单例模式
在一个py文件中创建一个对象,然后让外面的代码一直调用这个类,从而达到单例模式的目的。
'''基于模块的单例模式:提前产生一个对象 之后导模块使用'''
class C1:
def __init__(self, name):
self.name = name
obj = C1('jason')
def outer(cls):
_instance = cls('jason', 18)
def inner(*args, **kwargs):
if args or kwargs:
obj =cls(*args, **kwargs)
return obj
return _instance
return inner
@outer # Mysq1=outer(Mysq1)
class Mysq1:
def __init__(self, host, port):
self.host = host
self.port = port
obj1 = Mysq1()
obj2 = Mysq1()
obj3 = Mysq1()
print(obj is obj2 is obj3) # True
obj4 = Mysq1('1.1.1.3', 3307)
obj5 = Mysq1('1.1.1.4', 3308)
print(obj3 is obj4) # False
pickle序列化模块
优势:能够序列化python中所有的类型
缺陷:只能够在python中使用 无法跨语言传输
'''需求:产生一个对象并保存到文件中 取出来还是一个对象'''
class C1:
def __init__(self, name, age):
self.name = name
self.age = age
def func1(self):
print('from func1')
def func2(self):
print('from func2')
obj = C1('jason', 18)
# 这里的对象 并不能以对象的格式存储到文件中,因此我们使用pickle模块
import pickle
with open(r'a.txt', 'wb') as f:
pickle.dump(obj, f)
with open(r'a.txt', 'rb') as f:
data = pickle.load(f)
print(data)
# <__main__.C1 object at 0x0000026712c75BB0>
选课系统
选课系统
角色:学校、学员、课程、讲师
要求:
1. 创建北京、上海 2 所学校
2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
3. 课程包含,周期,价格,通过学校创建课程
4. 通过学校创建班级, 班级关联课程、讲师5. 创建学员时,选择学校,关联班级
5. 创建讲师角色时要关联学校,
6. 提供三个角色接口
6.1 学员视图, 可以注册, 交学费, 选择班级,
6.2 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班级学员列表 , 修改所管理的学员的成绩
6.3 管理视图,创建讲师, 创建班级,创建课程
7. 上面的操作产生的数据都通过pickle序列化保存到文件里
功能分析
管理员功能(最核心)
注册功能
登录功能
创建学校
创建课程
创建老师
讲师功能
登录功能
选择课程
查看课程
查看学生分数
修改学生分数
学生功能
注册功能
登录功能
选择学校
选择课程
查看课程分数
选课系统架构设计
三层架构
功能展示层
src.py
admin_view_py
teacher_view.py
student_view.py
核心逻辑层
admin_interface.py
teacher_interface.py
student_interface.py
数据处理层
db_hanlder.py
model.py
如图所示:
选课系统目录搭建
基于软件开发目录规范即可
选课系统功能搭建
空函数 循环 功能字典
标签:__,.__,name,选课,self,系统,Mysq1,def
From: https://www.cnblogs.com/oiqwyig/p/16875266.html