Java教程

py 单例模式及面向对象选课系统 day 30

本文主要是介绍py 单例模式及面向对象选课系统 day 30,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

今日学习内容

  • 昨日作业讲解
  • 设计模式之单例模式
  • pickle模块

作业讲解

# 题目
编写元类规定对象的所有数据值转大写
eg:
     obj.name = 'jason'
     print(obj.name)  # JASON

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, gender):
        self.name = name
        self.gender = gender

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


obj = MyClass('double', 'male')
print(obj.name)  
print(obj.gender)
obj.hobby = 'dbj'
print(obj.hobby)
# 结果
DOUBLE
MALE
DBJ

设计模式

市面上的设计模式有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__)
'以上仅是单例模式的其中一种表现方式'
https://www.cnblogs.com/Dominic-Ji/p/10525994.html
    
单例模式是指:保证一个类仅有一个实例,并提供一个访问它的全局访问点

pickle模块

# 简介
	pickle模块是Python专用的持久化模块,可以持久化包括自定义类在内的各种数据,比较适合Python本身复杂数据的存贮
# 缺点
    持久化后的字串是不可认读的,并且只支持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('double')
print(obj.school)
# school
obj.choose_course()
# double正在选课

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)  # 取出文件中的对象
# <__main__.MyClass object at 0x000001335B8DDA20>
print(data.name) 
# double
print(data.school)
# school


主要的方法:
在pickle中dumps()和loads()操作的是bytes类型,而在使用dump()和lload()读写文件时,要使用rb或wb模式,也就是只接收bytes类型的数据

1. pickle.dump(obj, file)
将Python数据转换并保存到pickle格式的文件内
withopen('data.pickle', 'wb') as f: 			pickle.dump(data, f)
    
2. pickle.dumps(obj)
将Python数据转换为pickle格式的bytes字串
import pickle
dic = {"k1":"v1","k2":123}
s = pickle.dumps(dic)
print(s)

3. pickle.load(file)
从pickle格式的文件中读取数据并转换为Python的类型
withopen('data.pickle', 'rb') as f:
    data = pickle.load(f)
    
4. pickle.loads(bytes_object)
将pickle格式的bytes字串转换为Python的类型
import pickle
dic1 = {"k1":"v1","k2":123}
s = pickle.dumps(dic1)
dic2 = pickle.loads(s)
print(dic2)

选课系统的项目分析

项目的要求

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

项目的架构

# 三层架构展示
首先是展示层:
	包括管理员视图、学生视图、讲师视图
其次是后台核心程序:
    管理员功能、学生功能、讲师功能
最后是数据层:
	models.by(存放以上三个角色的类数据)
	db_hanlter(存取数据的功能文件)
	Admin(存放管理员的信息)
    Teacher(存放教师的信息)
    Student(存放学生的信息)

项目目录搭建

启动文件        ---> start.py
conf文件夹      ---> settings.py
core文件夹      ---> src.py
				   admin_view.py
				   teacher_view.py
				   student_view.py       
db文件夹        ---> db_handler.py
				   models.py
				   Admin   ---> 管理员数据信息
				   Teacher ---> 教师数据信息
				   Student ---> 学生数据信息
interface文件夹 ---> admin_interface.py
				   teacher_interface.py
				   student_interface.py 
lib文件夹       ---> common.py
项目说明文件     ---> readme.txt
项目所导模块文件  ---> requirements.txt

数据保存剖析

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

# 如何通过对象获取类对应的字符串名称
obj = Admin('jason',123)
# 固定方法
print(obj.__class__)  # <class '__main__.Admin'>    类名
print(obj.__class__.__name__)  # Admin              字符串
这篇关于py 单例模式及面向对象选课系统 day 30的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!