首页 > 其他分享 >选课系统

选课系统

时间:2022-11-09 21:45:31浏览次数:31  
标签:__ .__ name 选课 self 系统 Mysq1 def

单例模式实现的多种方法

方式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序列化保存到文件里

功能分析

管理员功能(最核心)

注册功能
登录功能
创建学校
创建课程
创建老师

讲师功能

登录功能
选择课程
查看课程
查看学生分数
修改学生分数

学生功能

注册功能
登录功能
选择学校
选择课程
查看课程分数

选课系统架构设计

三层架构

img

功能展示层

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

如图所示:

image-20221109204853899.png

选课系统目录搭建

基于软件开发目录规范即可

选课系统功能搭建

空函数 循环 功能字典

image-20221109212644030.png

image-20221109212733408.png

标签:__,.__,name,选课,self,系统,Mysq1,def
From: https://www.cnblogs.com/oiqwyig/p/16875266.html

相关文章