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()
posted @ 2017-07-17 08:45  李大根er  阅读(380)  评论(0编辑  收藏  举报