继承+组合应用示例

 class Date: #定义时间类,包含姓名、年、月、日,用于返回生日
def __init__(self,name,year,mon,day):
self.name = name
self.year=year
self.mon=mon
self.day=day
def tell_birth(self):
print('%s:%s-%s-%s'%(self.name,self.year,self.mon,self.day)) class Course: #定义课程类,包含姓名,课程名、价格,用于返回学生报的课程信息或老师的教学信息
def __init__(self,name,price,period):
self.name=name
self.price=price
self.period=period
def tell_course(self):
print('''
--------%s course info------------
course name:%s
course price:%s
course period:%s
'''%(self.name,self.name,self.price,self.period))
class People: #定义父类People,减少学生类和老师类的代码量
def __init__(self,name,age,sex,year,mon,day):
self.name=name
self.age=age
self.sex=sex
self.courses=[] #用于存放课程名称,如果没有这个默认值,下边course_info可以用if判断
self.birth=Date(name,year,mon,day)
def walk(self):
print('%s is walking' %self.name)
def course_info(self): #
# if 'courses' in self.__dict__: 可以是判断对象是否包含课程信息,加个默认值就肯定有courses
for obj in self.courses: #循环查看课程信息,即课程对象的tell_course属性
obj.tell_course()
class Teacher(People):
def __init__(self,name,age,sex,salary,level,year,mon,day):
People.__init__(self,name,age,sex,year,mon,day) #因为父类的初始化需要这些参数,如果不初始化会报错
self.salary=salary
self.level=level
def teach(self):
print('%s is teaching' %self.name)
def tell_info(self):
print('''
--------------%s info--------------
NAME:%s
AGE:%s
SEX:%s
SAL:%s
LEVEL:%s
'''%(self.name,self.name,self.age,self.sex,self.salary,self.level)) class Student(People):
def __init__(self,name,age,sex,group,year,mon,day):
People.__init__(self,name, age, sex,year,mon,day)
self.group=group
def tell_info(self):
print('''
--------------%s info--------------
NAME:%s
AGE:%s
SEX:%s
GROUP:%s
'''%(self.name,self.name,self.age,self.sex,self.group))

测试验证:

 bob=Teacher('bob',84,'female',300000,-1,1994,5,27)
print(bob.__dict__)
3 #输出
{'name': 'bob', 'age': 84, 'sex': 'female', 'courses': [], 'birth': <__main__.Date object at 0x000001E117677278>, 'salary': 300000, 'level': -1} bob.birth.tell_birth()
7 #输出
bob:1994-5-27 python=Course('Python',15800,'5month') #定义课程对象
linux=Course('Linux',12800,'4month')
bob.courses.append(python) #将课程对象加到bob的课程列表中
bob.courses.append(linux)
bob.course_info() #调用bob的course_info属性,循环输出课程对象的tell_course属性,如果课程列表中没有课程对象,那么就没有输出
15 #输出
--------Python course info------------
course name:Python
course price:15800
course period:5month --------Linux course info------------
course name:Linux
course price:12800
course period:4month # bob.courses[0].tell_course(),这是用很low的方法查看课程信息

对象的序列化和反序列化

py对象的序列化是基于pickle模块完成的,pickle模块支持所有的py数据的序列化,json模块只能够支持各种编程语言通用的数据类型

对象基于文件反序列化,需要生成该对象的类存在于内存中,并且没有被隔离

序列化示例:

创建类文件

 #创建student_class.py文件,定义一个类
class Student:
def __init__(self, name, age, sex, group):
self.name=name
self.age=age
self.sex=sex
self.group=group
def study(self):
print('%s is study' % self.name)
def tell_info(self):
print('''
----------%s info---------
NAME:%s
AGE:%s
SEX:%s
group:%s
''' %(self.name,self.name,self.age,self.sex,self.group))

创建序列化执行文件:二进制写入的文件student.pkl需要用二进制方式才能打开

 #创建serialize.py文件
import pickle #导入pickle模块
import student_class #导入上面的类模块
with open('student.pkl','wb') as file:
student1=student_class.Student('bob',15,'male','T3') #创建对象
pickle.dump(student1,file) #序列化对象写入文件student.pkl

创建反序列化文件:

 #创建反序列化执行文件deserialize.py
import pickle
import student_class
with open('student.pkl','rb') as file:
print(file.read())
#测试输出结果:
# 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.'
bob=pickle.load(file) #用load反序列化不能fild.read(),否则会提示EOFError:Ran out of input,因为file.read()已经将文件读完了
bob.tell_info()

 选课系统综合示例:待补充

pass

最新文章

  1. linux deepin-scrot 截图工具
  2. android ViewGroup事件分发机制
  3. 支持高并发的IIS Web服务器常用设置 II
  4. Session的使用(登录例案+其它页面访问)
  5. HTML5游戏实战(4): 20行代码实现FlappyBird
  6. linux之C编程实战小例
  7. iOS崩溃日志分析-b
  8. IDEA如何打包可运行jar的一个问题。
  9. 【转】Tomcat7.0.42源代码运行环境搭建
  10. IF的使用
  11. Git一些其它的功能
  12. IntelliJ IDEA安装配置
  13. LeakCanary 来检查 Android 内存泄漏
  14. edit 控件之隐藏光标
  15. OC 与 js 界面JSBridge交互
  16. vue不通过路由直接获取url中参数的方法示例
  17. PyCharm+Miniconda3安装配置教程
  18. HDU 3829
  19. RotateCard(自定义旋转view)
  20. 编写高质量代码改善C#程序的157个建议——建议68:从System.Exception或其他常见的基本异常中派生异常

热门文章

  1. 换行符 \r \n \r\n 在不同系统下的区别
  2. lnmp、lamp、lnmpa一键安装包(Updated: 2016-4-12)
  3. centos7.2进入单用户模式修改密码
  4. aircrack加reaver破解带有wps的wifi
  5. centos 挂在ntfs
  6. Python的语言特性
  7. .net设置浏览器的文本模式
  8. 16:django 有条件的视图处理(Last-Modified和ETag)&amp;&amp;加密签名
  9. 15:django 缓存架构
  10. sharding-jdbc 实现分表