选课系统项目开发前戏

本文介绍了Python中的元类实际应用,展示了如何利用元类使对象属性值自动转换为大写。接着讲解了设计模式中的单例模式,用于确保类只有一个实例,节省资源。此外,探讨了pickle模块在对象序列化和反序列化中的作用。最后,提出了一个选课系统项目的概要,包括角色、功能分析和初步的目录结构。项目涵盖了学校、学员、课程、讲师的角色,并涉及注册、登录、选择学校和课程等功能。
摘要由CSDN通过智能技术生成

1 > 元类的实际应用

&emps; 基于昨天上博客写的内容,我们可以利用元类编写元类规定对象的所有数值转成大写。


class MyTypeClass(type):
    def __call__(self, *args, **kwargs):
        args = [i.upper() for i in args]
        return super().__call__(*args, **kwargs)

class MyClass(metaclass=MyTypeClass):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __setattr__(self, key, value):
        self.__dict__[key] = value


obj = MyClass('bob', '18')
print(obj.name)
print(obj.age)
obj.pwd = '123'
print(obj.pwd)


2 > 设计模式

&emps; 设计模式是前辈们发明的经过反复验证用于解决固定问题的固定套路,在IT行业中设计模式共有23种 大致可以分为三大类。我们目前主要学习单例模式即可。

	1.创建型
	2.结构型
	3.行为型

2.1 > 设计模式之单例模式(23种之一)

  单例模式的意思是一个类只能产生一个对象 用于节约资源
  应用场景如下:
  当有一个类有很多非常牛逼的绑定给对象的方法时,我们需要在很多地方去使用它,那么不同的程序员来用不知道有没有产生对象,所以会自己创建一个新的对象,如此往复则会造成资源的浪费。
  实现过程如下:
  我们需要在类实例化对象 的时候进行干涉 >>>: 元类


class Single(type):
   new_obj = None     # 判断当前元类是否已经产生一个对象
   def __call__(self, *args, **kwargs):
       if not self.new_obj:      # 如果当前元类没有产生一个对象
           obj = super().__call__(*args, **kwargs)     # 产生一个空对象
           self.new_obj = obj			# 给空对象赋值
           return self.new_obj			# 返回这个对象
       return self.new_obj		# 如果当前元类产生过一个对象 直接返回这个对象		

class MyClass(metaclass=Single):
    pass

obj = MyClass()
obj1 = MyClass()

print(id(obj), id(obj1))

'''
2688016684256 2688016684256
'''


  单例模式可以有很多种的编写方式,并且实现方式不固定,有很多种。

3 > pickle模块

  与json模块类似都是将数据格式存入文件之后取出来不改变其格式化,pickle模块是将对象写入文件,并且再取出来后还可以使用对象的一些功能。但是该模块只支持python兼容性很差。


import pickle

# 创建一个类
class MyClass(object):
    school = 'school'
    def __init__(self, name):
        self.name = name

    def choose_coure(self):
        print('%s正在选课'% self.name)

# 创建一个对象
obj = MyClass('bob')

# 将对象利用pickle模块写入文件
with open(r'%s'% obj.name, 'wb') as f:
    pickle.dump(obj, f)

#将对象利用pickle模块取出
with open(r'jason', 'rb') as f:
    data = pickle.load(f)

print(data.name)
'''
bob
'''

4 > 选课系统项目

4.1 > 项目分析


选课系统
		角色:学校、学员、课程、讲师
		要求:
      1. 创建北京、上海 2 所学校
      2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开
      3. 课程包含,周期,价格,通过学校创建课程
      4. 通过学校创建班级, 班级关联课程、讲师
      5. 创建学员时,选择学校,关联班级
      5. 创建讲师角色时要关联学校,
      6. 提供三个角色接口
          6.1 学员视图, 可以登录,注册, 选择学校,选择课程,查看成绩
          6.2 讲师视图, 讲师登录,选择学校,选择课程, 查看课程下学员列表 , 修改所管理的学员的成绩
          6.3 管理视图,登录,注册,创建讲师, 创建班级,创建课程,创建学校
      7. 上面的操作产生的数据都通过pickle序列化保存到文件里
  

4.2 > 功能分析


管理员视图
	注册
  登录
  创建学校
  创建课程
  创建讲师
  
讲师视图
	登录
  查看教授课程
  选择教授课程
  查看课程学生
 	评判学生分数

学员视图
	注册
  登录
  选择学校
  选择课程
  查看分数

4.3 > 项目目录搭建

  创建以下项目目录


conf
	setting.py
core
	admin_view.py
	src.py
	student_view.py
	teacher.py
db
	db_handle.py
	modles.py
interface
	admin_interface.py
	student_interface.py
	teacher_interface.py
lib
	common
start.py



4.4 > 项目功能搭建

1 > 框架搭建

  在core文件夹中搭建功能框架

                  '''src.py'''

from core import admin_view,student_view,teacher_view

module_dict = {

    '1': admin_view,
    '2': student_view,
    '3': teacher_view,

}


def run():
    while True:
        print('''
        ================== 选课系统 ==================
        
                        1. 管理员视图
                        2. 学生视图
                        3. 教室视图
                        
        ================== 选课系统 ==================
        
        ''')
        choice = input('请输入你想进入的视图 >>>>>>:').strip()
        if choice in module_dict:
            module_name = module_dict.get(choice)
            module_name.run()
        else:
            print(' --该视图不存在--')

                  '''admin_view.py'''
def register():
    print('学员注册功能')


def login():
    print('学员登录功能')


def select_school():
    print('学员选择学校')


def select_course():
    print('学员选择课程')


def check_score():
    print('学员查看成绩')


func_dict = {
    '1': register,
    '2': login,
    '3': select_school,
    '4': select_course,
    '5': check_score,
}


def run():
    while True:
        print('''
         ================== 学员视图 ==================

                            1.学员注册
                            2.学员登录
                            3.选择学校
                            4.选择课程
                            5.查看成绩

        ================== 学员视图 ==================
        ''')
        choice = input('请输入你想执行的功能编号 >>>>>>:').strip()
        if choice == 'q':
            return  # 返回上一层功能选择
        if choice in func_dict:
            func_name = func_dict.get(choice)
            func_name()
        else:
            print(' --该功能不存在--')
                  '''student_view.py'''
def register():
    print('学员注册功能')


def login():
    print('学员登录功能')


def select_school():
    print('学员选择学校')


def select_course():
    print('学员选择课程')


def check_score():
    print('学员查看成绩')


func_dict = {
    '1': register,
    '2': login,
    '3': select_school,
    '4': select_course,
    '5': check_score,
}


def run():
    while True:
        print('''
         ================== 学员视图 ==================

                            1.学员注册
                            2.学员登录
                            3.选择学校
                            4.选择课程
                            5.查看成绩

        ================== 学员视图 ==================
        ''')
        choice = input('请输入你想执行的功能编号 >>>>>>:').strip()
        if choice == 'q':
            return  # 返回上一层功能选择
        if choice in func_dict:
            func_name = func_dict.get(choice)
            func_name()
        else:
            print(' --该功能不存在--')
                  '''teacher_view.py'''
def login():
    print('讲师登录功能')


def check_teach_course():
    print('讲师查看课程')


def select_teach_course():
    print('讲师选择课程')


def check_course_student():
    print('讲师查看学生')


def update_student_score():
    print('讲师设置分数')


func_dict = {
    '1': login,
    '2': check_teach_course,
    '3': select_teach_course,
    '4': check_course_student,
    '5': update_student_score
}


def run():
    while True:
        print("""
        ================== 讲师视图 ==================

                          1.讲师登录
                          2.查看课程
                          3.选择课程
                          4.查看学员
                          5.设置分数

        ================== 讲师视图 ==================
                """)
        choice = input('请输入您想要执行的视图编号>>>:').strip()
        if choice == 'q':
            return  # 返回上一层功能选择
        if choice in func_dict:
            func_name = func_dict.get(choice)
            func_name()
        else:
            print('暂无该功能编号')

2 > 注册功能

  编写管理员注册功能

                     '''admin_view.py'''
from interface import admin_interface


def register():
    username = input('请输入注册的用户名 >>>>> :').strip()
    password = input('请输入注册的密码 >>>>>> :').strip()
    again_pwd = input('再次输入注册的密码 >>>>> :').strip()
    # 判断两次密码输入是否一致
    if not password == again_pwd:
        print('\n两次密码输入不一致')
    flag, res = admin_interface.register_interface(username, password)
    print(res)

                     '''admin_interface.py'''
from db import module


def register_interface(name, pwd):
    # 1.判断对象是否存在
    obj = module.Admin.get_obj(name)
    if obj:
        return False, '用户名已存在'
    # 2.对象不存在创建对象并且保存
    module.Admin(name, pwd)
    return True, f'{name}注册成功'
                     '''module.py'''
from db import db_handle


class Admin:
    def __init__(self, name, pwd):
        self.name = name
        self.pwd = pwd
        # 如果能运行到实例化就自动保存对象
        self.save()

    def save(self):
        db_handle.save_obj(self)

    @classmethod  # 绑定给类的方法
    def get_obj(cls,name):
       return db_handle.get_obj(cls, name)            
                     '''db_handle.py'''
from conf import settings
import os
import pickle


def save_obj(obj):
    # 1.先获取当前对象所载的文件夹路径
    file_path = os.path.join(settings.DB_DIR, obj.__class__.__name__)
    # 2.判断当前文件夹路径是否存在
    if not os.path.exists(file_path):
        os.mkdir(file_path)
    # 3.存在则拼接对象文件路径
    obj_file_path = os.path.join(file_path, obj.name)
    with open(obj_file_path, 'wb') as f:
        pickle.dump(obj, f)

def get_obj(cls, name):
    obj_file_path = os.path.join(settings.DB_DIR, cls.__name__, name)
    if os.path.exists(obj_file_path):
        with open(obj_file_path, 'rb') as f:
            obj = pickle.load(f)
        return obj
                     '''conf --> settings.py'''
# 路径信息
import os
DASE_DIR = os.path.dirname(os.path.dirname(__file__))
DB_DIR = os.path.join(DASE_DIR, 'db')
          

  简单的注册功能就这么写完了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值