ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python设计模式和选课系统

2022-04-12 19:31:19  阅读:175  来源: 互联网

标签:__ obj name 选课 python self path 设计模式 pickle


python设计模式和选课系统

设计模式

# 设计模式的定义:
设计模式是前辈们经过相当长的一段时间的试验和错误总结出来的最佳实践
设计模式是前辈们发明的经过反复验证用于解决固定问题的固定套路

#在IT行业中设计模式总共有23种 可以分为三大类
  1.创建型
  2.结构型
  3.行为型
    
#常见的模式:
工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式、适配器模式、桥接模式、过滤器模式、策略模式等

设计模式之单例模式

# 单例模式:
单例模式是一个类只能产生一个对象  用于节省资源

#应用常场景:
有一个类中有很多非常牛逼的绑定给对象的方法
    我们需要在很多地方使用它 那么不同的程序员来用不知道有没有产生对象
    所以自己会创建一个新对象 如此往复则会造成资源的浪费
    
# 代码示例:
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):
        def __init__(self, name):
            self.name = name
    obj1 = MyClass('jason')
    obj2 = MyClass('tony')
    print(id(obj1), id(obj2))
    print(obj1.__dict__,obj2.__dict__)
    
'''实现单例模式的方式有很多 也有基于classmethod、装饰器、元类、__new__、模块 '''

设计模式之工厂模式

'''每个工厂负责生产自己工厂的水果即可,避免了在新增产品时需要修改工厂的代码 '''

# 代码示例:
class Orange(object):
    print('橘子')

class Func_Factors():

    def get_fruit(fruit_name):
        if fruit_name == 'a':
            return Apple()
        elif fruit_name == 'b':
            return Banana()
        elif fruit_name == 'c':
            return Orange()
        else:
            return '没有水果'


aaa = Func_Factors.get_fruit('a')
bbb = Func_Factors.get_fruit('b')
ccc = Func_Factors.get_fruit('c')

pickle模块

# pickle模块
该pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议

“Pickling”是将Python对象层次结构转换为字节流的过程, “unpickling”是反向操作,从而将字节流(来自二进制文件或类似字节的对象)转换回对象层次结构

pickle模块对于错误或恶意构造的数据是不安全的。

#pickle和json 的区别:

  1. JSON是一种文本序列化格式(它输出unicode文本,虽然大部分时间它被编码utf-8),而pickle是二进制序列化格式;

  2. JSON是人类可读的,而pickle则不是;

  3. JSON是可互操作的,并且在Python生态系统之外广泛使用,而pickle是特定于Python的;
    
# 代码示例:
import pickle

class MyClass(object):
    school = 'school'
    def __init__(self, name):
        self.name = name
    def choose_course(self):
        print('%s正在选课'%self.name)
obj = MyClass('jason')
print(obj.school)
obj.choose_course()

# pickle可以
# with open(r'%s'%obj.name,'wb') as f:
#     pickle.dump(obj, f)

with open(r'jason','rb') as f:
    data = pickle.load(f)
print(data)
print(data.name)
print(data.school)

'''由于json无法储存对象类型 该模块的目的仅仅是为了在选课系统中使用 后期会学习ORM就不会用pickle了'''


选课系统

选课系统项目分析

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

选课系统项目功能分析

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

项目目录的搭建

数据保存的分析

保存数据

def save(obj):
    file_path = os.path.join(settings.DB_DIR, obj.__class__.__name__)

    if not os.path.exists(file_path):
        os.mkdir(file_path)
    wenjian_path = os.path.join(file_path, obj.username)
    with open(wenjian_path,'wb')as f:
        pickle.dump(obj, f)

判断用户是否存在

def get_obj(cls, username):
    file_path = os.path.join(settings.DB_DIR, cls.__name__,username)
    if os.path.exists(file_path):
        with open(file_path,'rb')as f:
            obj = pickle.load(f)
            return obj

创建与类名一样的文件夹

类产生的对象在保存的时候	
	自动创建一个与类名一样的文件夹名 将数据保存到该文件夹内

# 如何通过对象获取类对应的字符串名称
obj = Admin('jason',123)
# 固定方法
print(obj.__class__)  # <class '__main__.Admin'>    类名
print(obj.__class__.__name__)  # Admin              字符串

标签:__,obj,name,选课,python,self,path,设计模式,pickle
来源: https://www.cnblogs.com/niceplayerzzz/p/16136565.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有