python基础之继承组合应用、对象序列化和反序列化,选课系统综合示例
继承+组合应用示例
1 class Date: #定义时间类,包含姓名、年、月、日,用于返回生日
2 def __init__(self,name,year,mon,day):
3 self.name = name
4 self.year=year
5 self.mon=mon
6 self.day=day
7 def tell_birth(self):
8 print('%s:%s-%s-%s'%(self.name,self.year,self.mon,self.day))
9
10
11 class Course: #定义课程类,包含姓名,课程名、价格,用于返回学生报的课程信息或老师的教学信息
12 def __init__(self,name,price,period):
13 self.name=name
14 self.price=price
15 self.period=period
16 def tell_course(self):
17 print('''
18 --------%s course info------------
19 course name:%s
20 course price:%s
21 course period:%s
22 '''%(self.name,self.name,self.price,self.period))
23 class People: #定义父类People,减少学生类和老师类的代码量
24 def __init__(self,name,age,sex,year,mon,day):
25 self.name=name
26 self.age=age
27 self.sex=sex
28 self.courses=[] #用于存放课程名称,如果没有这个默认值,下边course_info可以用if判断
29 self.birth=Date(name,year,mon,day)
30 def walk(self):
31 print('%s is walking' %self.name)
32 def course_info(self): #
33 # if 'courses' in self.__dict__: 可以是判断对象是否包含课程信息,加个默认值就肯定有courses
34 for obj in self.courses: #循环查看课程信息,即课程对象的tell_course属性
35 obj.tell_course()
36 class Teacher(People):
37 def __init__(self,name,age,sex,salary,level,year,mon,day):
38 People.__init__(self,name,age,sex,year,mon,day) #因为父类的初始化需要这些参数,如果不初始化会报错
39 self.salary=salary
40 self.level=level
41 def teach(self):
42 print('%s is teaching' %self.name)
43 def tell_info(self):
44 print('''
45 --------------%s info--------------
46 NAME:%s
47 AGE:%s
48 SEX:%s
49 SAL:%s
50 LEVEL:%s
51 '''%(self.name,self.name,self.age,self.sex,self.salary,self.level))
52
53 class Student(People):
54 def __init__(self,name,age,sex,group,year,mon,day):
55 People.__init__(self,name, age, sex,year,mon,day)
56 self.group=group
57 def tell_info(self):
58 print('''
59 --------------%s info--------------
60 NAME:%s
61 AGE:%s
62 SEX:%s
63 GROUP:%s
64 '''%(self.name,self.name,self.age,self.sex,self.group))
测试验证:
1 bob=Teacher('bob',84,'female',300000,-1,1994,5,27)
2 print(bob.__dict__)
3 #输出
4 {'name': 'bob', 'age': 84, 'sex': 'female', 'courses': [], 'birth': <__main__.Date object at 0x000001E117677278>, 'salary': 300000, 'level': -1}
5
6 bob.birth.tell_birth()
7 #输出
8 bob:1994-5-27
9
10 python=Course('Python',15800,'5month') #定义课程对象
11 linux=Course('Linux',12800,'4month')
12 bob.courses.append(python) #将课程对象加到bob的课程列表中
13 bob.courses.append(linux)
14 bob.course_info() #调用bob的course_info属性,循环输出课程对象的tell_course属性,如果课程列表中没有课程对象,那么就没有输出
15 #输出
16 --------Python course info------------
17 course name:Python
18 course price:15800
19 course period:5month
20
21
22 --------Linux course info------------
23 course name:Linux
24 course price:12800
25 course period:4month
26
27 # bob.courses[0].tell_course(),这是用很low的方法查看课程信息
对象的序列化和反序列化
py对象的序列化是基于pickle模块完成的,pickle模块支持所有的py数据的序列化,json模块只能够支持各种编程语言通用的数据类型
对象基于文件反序列化,需要生成该对象的类存在于内存中,并且没有被隔离
序列化示例:
创建类文件
1 #创建student_class.py文件,定义一个类
2 class Student:
3 def __init__(self, name, age, sex, group):
4 self.name=name
5 self.age=age
6 self.sex=sex
7 self.group=group
8 def study(self):
9 print('%s is study' % self.name)
10 def tell_info(self):
11 print('''
12 ----------%s info---------
13 NAME:%s
14 AGE:%s
15 SEX:%s
16 group:%s
17 ''' %(self.name,self.name,self.age,self.sex,self.group))
创建序列化执行文件:二进制写入的文件student.pkl需要用二进制方式才能打开
1 #创建serialize.py文件
2 import pickle #导入pickle模块
3 import student_class #导入上面的类模块
4 with open('student.pkl','wb') as file:
5 student1=student_class.Student('bob',15,'male','T3') #创建对象
6 pickle.dump(student1,file) #序列化对象写入文件student.pkl
创建反序列化文件:
1 #创建反序列化执行文件deserialize.py
2 import pickle
3 import student_class
4 with open('student.pkl','rb') as file:
5 print(file.read())
6 #测试输出结果:
7 # b'\x80\x03cstudent_class\nStudent\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00bobq\x04X\x03\x00\x00\x00ageq\x05K\x0fX\x03\x00\x00\x00sexq\x06X\x04\x00\x00\x00maleq\x07X\x05\x00\x00\x00groupq\x08X\x02\x00\x00\x00T3q\tub.'
8 bob=pickle.load(file) #用load反序列化不能fild.read(),否则会提示EOFError:Ran out of input,因为file.read()已经将文件读完了
9 bob.tell_info()
python基础之继承组合应用、对象序列化和反序列化,选课系统综合示例的更多相关文章
- python第四十九课——对象序列化与反序列化
person.py class Person: def __init__(self,*args,**kwargs): print('我是Person类的构造...') # self.name=name ...
- python基础学习1-json,pickle的序列化和反序列化
import requests import json dic={'k1':'v1'} print(dic,type(dic)) result = json.dumps(dic)#调用dumps方法把 ...
- Python开发基础-Day19继承组合应用、对象序列化和反序列化,选课系统综合示例
继承+组合应用示例 class Date: #定义时间类,包含姓名.年.月.日,用于返回生日 def __init__(self,name,year,mon,day): self.name = nam ...
- 二十二. Python基础(22)--继承
二十二. Python基础(22)--继承 ● 知识框架 ● 继承关系中self的指向 当一个对象调用一个方法时,这个方法的self形参会指向这个对象 class A: def get(s ...
- python基础——类名称空间与对象(实例)名称空间
python基础--类名称空间与对象(实例)名称空间 1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类 ...
- C#对象序列化与反序列化zz
C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍........................ ...
- C#对象序列化与反序列化
C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍.......................... ...
- [转载]C#对象序列化与反序列化
文章写的实在是太好了,忍不住转来: http://www.cnblogs.com/LiZhiW/p/3622365.html#_Toc8478 1.对象序列化的介绍 (1).NET支持对象序列化的几种 ...
- Java之对象序列化和反序列化
一.对象序列化和反序列化存在的意义: 当你创建对象,只要你需要,他就一直存在,但当程序结束,对象就会消失,但是存在某种情况,如何让程序在不允许的状态,仍然保持该对象的信息.并在下次程序运行的时候使用该 ...
随机推荐
- 我的Android开发之路——百度地图开源工具获取定位信息
定位技术在现在的移动设备上是必不可少的,许多app都会使用定位功能. 通常定位方式有两种:GPS定位:网络定位. Android系统对这两种定位方式都提供了相应的API支持,但是因为google的网络 ...
- count group by 组合用法
1 需求是 求订单表1个月内 订单累计费用超过500的有多少人 根据题意 最先写出的sql是这样的 SELECT SUM(totalfee)AS n FROM sendorder WHERE `add ...
- jshint-eclipse: JavaScript Code Quality Plugin for Eclipse
https://blog.oio.de/2012/03/26/jshint-eclipse-javascript-code-quality-plugin-for-eclipse/ techscou ...
- ICCV 2017 Best Paper Awards
[ICCV 2017 Best Paper Awards]今年的ICCV不久前公布了Best Paper得主,來自Facebook AI Research的Mask R-CNN[1],與RetineN ...
- Node.js-sublime text3 配置node.js(ERROR: The process "node.exe" not found.)
默认已经安装好sublime.node和npm 1.sublime的node.js插件下载 由于在package control上经常下载失败,所以这里直接从GitHub上进行下载! GitHub下载 ...
- 请教Nutzwk项目,在beetl页面怎么用shiro标签呢?
请教Nutzwk项目,在beetl页面怎么用shiro标签呢? 发布于 381天前 作者 WenTao-Love 195 次浏览 复制 上一个帖子 下一个帖子 标签: nutzwk 如题 ...
- 2.NBU管理NetBackup
2管理NetBackup2.1NetBackup作业任务监视 NetBackup任务监视器可以监视备份.恢复和归档任务的状态,也可以监视NetBackup本身数据库的备份. 2.1.1Activity ...
- EF 状态版 增删改
1.利用 状态版 实现 增加 . 2.利用状态版 进行 删除 3. 利用状态版 实现 修改 ,修改 方法 有3种 第1种修改方法 第2种修改 方法 第3种修改方法
- 【洛谷P1996】约瑟夫问题
约瑟夫问题 链表模拟大概是正解 #include<iostream> using namespace std; struct node{ //单链表 int d; node *next; ...
- CUDA线性内存分配
原文链接 概述:线性存储器可以通过cudaMalloc().cudaMallocPitch()和cudaMalloc3D()分配 1.1D线性内存分配 1 cudaMalloc(void**,int) ...