选课系统项目
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')
简单的注册功能就这么写完了。