python基礎之繼承組合應用、對象序列化和反序列化,選課系統綜合示例
阿新 • • 發佈:2017-07-17
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基礎之繼承組合應用、對象序列化和反序列化,選課系統綜合示例