day20
目录
1.下面这段代码的输出结果将是什么?请解释。
class Parent(object):
x = 1
class Child1(Parent):
pass
class Child2(Parent):
pass
print(Parent.x, Child1.x, Child2.x)
#输出结果为1,1,1,因为对象的查找顺序为对象本身,对象本身没有会到类里面查找,最后到父类去查找
Child1.x = 2
print(Parent.x, Child1.x, Child2.x)
#输出结果为1,2,1
Parent.x = 3
print(Parent.x, Child1.x, Child2.x)
#输出结果为3,2,3
2.多重继承的执行顺序,请解答以下输出结果是什么?并解释。
class A(object):
def __init__(self):
print('A')
super(A, self).__init__()
class B(object):
def __init__(self):
print('B')
super(B, self).__init__()
class C(A):
def __init__(self):
print('C')
super(C, self).__init__()
class D(A):
def __init__(self):
print('D')
super(D, self).__init__()
class E(B, C):
def __init__(self):
print('E')
super(E, self).__init__()
class F(C, B, D):
def __init__(self):
print('F')
super(F, self).__init__()
class G(D, B):
def __init__(self):
print('G')
super(G, self).__init__()
if __name__ == '__main__':
g = G() # G D A B
f = F() # F C B D A
新式类的查找从左边一条支路开始查找,找到两条分支共同的父类前面那个类,然后返回查找下一条分支,直到找完所有的分支,然后再找共同的父类。
3.什么是新式类,什么是经典类,二者有什么区别?什么是深度优先,什么是广度优先?
1.python3默认都是新式类
2.python2中才有新式类和经典类的区别,新式类是继承object的类,经典类是没有继承object类。
3.区别是有没有继承object类
4.深度优先是经典类的属性查找方式,深度优先从左到右依次一个一个分支查找,而且如果分支有公共父类,在第一条分支当中就把这个父类查找了
5.广度优先是新式类的属性查找方式,它和深度优先的区别是最后查找公共父类
4.用面向对象的形式编写一个老师类, 老师有特征:编号、姓名、性别、年龄、等级、工资,老师类中有功能。
1.生成老师唯一编号的功能,可以用hashlib对当前时间加上老师的所有信息进行校验得到一个hash值来作为老师的编号
def create_id(self):
pass
2.获取老师所有信息
def tell_info(self):
pass
3.将老师对象序列化保存到文件里,文件名即老师的编号,提示功能如下
def save(self):
with open('老师的编号','wb') as f:
pickle.dump(self,f)
4.从文件夹中取出存储老师对象的文件,然后反序列化出老师对象,提示功能如下
def get_obj_by_id(self,id):
return pickle.load(open(id,'rb'))
5、按照定义老师的方式,再定义一个学生类
6、抽象老师类与学生类得到父类,用继承的方式减少代码冗余
# -*-coding:utf-8-*-
# Author: yqliu
# CreatDate: 2019/10/11 14:24
import time
import hashlib
import pickle
#基类
class People:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def create_id(self):
info = time.strftime('%Y-%m-%d') + self.name + str(self.age) + str(self.sex)
m=hashlib.md5()
m.update(info.encode('utf-8'))
self.id=m.hexdigest()
return self.id
def save(self):
with open(f'{self.create_id()}','wb') as fw:
pickle.dump(self.tell(),fw)
def get_obj_by_id(self):
with open(f'{self.create_id()}','rb') as fr:
return pickle.load(fr)
#老师类
class Teacher(People):
def __init__(self,name,age,sex,level,salary):
super().__init__(name,age,sex)
self.level=level
self.salary=salary
def tell(self):
info={
'name':self.name,
"age":self.age,
'sex':self.sex,
'level':self.level,
'salary':self.salary,
'id':self.create_id(),
}
print (info)
return info
#学生类
class Student(People):
def __init__(self,name,age,sex,course):
super().__init__(name,age,sex)
self.course=course
def tell(self):
info={
'name':self.name,
'age':self.age,
'sex':self.sex,
'course':self.course,
'id':self.create_id(),
}
print (info)
return info
teacher_tank=Teacher('tank',19,'male',10,30)
teacher_tank.tell()
id=teacher_tank.create_id()
print (id)
teacher_tank.save()
res2=teacher_tank.get_obj_by_id()
print (res2,type(res2))
print ("*"*100)
stu1=Student('yqliu',10,'male','python')
stu1.tell()
id=stu1.create_id()
print (id)
stu1.save()
res3=stu1.get_obj_by_id()
print (res3)