• 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'x80x03cstudent_class
    Student
    qx00)x81qx01}qx02(Xx04x00x00x00nameqx03Xx03x00x00x00bobqx04Xx03x00x00x00ageqx05Kx0fXx03x00x00x00sexqx06Xx04x00x00x00maleqx07Xx05x00x00x00groupqx08Xx02x00x00x00T3q	ub.'
    8     bob=pickle.load(file)   #用load反序列化不能fild.read(),否则会提示EOFError:Ran out of input,因为file.read()已经将文件读完了
    9     bob.tell_info()
  • 相关阅读:
    Auto Complete with Redis
    老男孩 movie
    e人e本
    邀请大家使用dropbox
    mac Espresso
    it网站
    To Trie or not to Trie – a comparison of efficient data structures
    [转载]提高Python程序的运行速度_李小红_新浪博客
    TSTTernary Search TreeCreating An English Dictionary for lookup and spell checking | CracktheInterview
    平衡二叉搜索树
  • 原文地址:https://www.cnblogs.com/lidagen/p/7192714.html
Copyright © 2020-2023  润新知