1. 程式人生 > >python基礎之繼承組合應用、對象序列化和反序列化,選課系統綜合示例

python基礎之繼承組合應用、對象序列化和反序列化,選課系統綜合示例

sel 初始 否則 通用 __init__ period 類型 反序列化 信息

繼承+組合應用示例

 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基礎之繼承組合應用、對象序列化和反序列化,選課系統綜合示例