1、下面这段代码的输出结果将是什么?请解释。
class Parent(object):
x = 1
class Child1(Parent):
pass
class Child2(Parent):
pass
print(Parent.x, Child1.x, Child2.x)
# 打印111,对象没有向子类查找,子类没有向父类查找,所以x都是1
Child1.x = 2
print(Parent.x, Child1.x, Child2.x)
# 打印121,这里添加Child1的变量x变为2,所以打印Child1.x 为2
Parent.x = 3
print(Parent.x, Child1.x, Child2.x)
# 打印323,这里又将Parent.x修改为3,但是Child1.x 还是2
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()
f = F()
'''
g=G() 输出 G-D-A-B
这里D B不是继承同一个类,所以不需要找下一个类
f=F() 输出 F-C-B-D-A
这里因为 C D 继承同一个类,所以遵循广度优先,A最后查找
3、什么是新式类,什么是经典类,二者有什么区别?什么是深度优先,什么是广度优先?
'''
新式类:
python3中所有的类都是新式类,python2中继承object的类
新式类是广度优先:
不找多个类最后继承的统一一个类,直接去找下一个父类
经典类:
python2中才有经典类,凡是没有继承object的类
经典类是深度优先:
查找继承类时,会从对象一直查找到基类,如果基类查找不到会从左到右继续查找第二个
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、按照定义老师的方式,再定义一个学生类
import hashlib
import time
import pickle
class teacher:
def __init__(self,name,sex,age,level,salary):
self.name = name
self.sex = sex
self.age = age
self.level =level
self.salary = salary
def create_id(self):
'''生成老师唯一编号的功能,可以用hashlib对当前时间加上老师的所有信息进行校验得到一个hash值来作为'''
format_time = time.strftime("%Y-%m-%d %X")
data = format_time + self.name + str(self.age) + self.level + self.sex + str(self.salary)
# 对data 进行哈希处理
m = hashlib.md5(data.encode('utf-8'))
self.id = m.hexdigest()
return self.id
def tell_info(self):
'''获取老师的所有信息'''
print(f'''
{self.id}
{self.name}
{self.age}
{self.sex}
{self.level}
{self.salary}
''')
def save(self):
'''将老师对象序列化保存到文件里,文件名即老师的编号'''
with open(self.id, 'wb') as f:
pickle.dump(self, f)
def get_obj_by_id(self):
'''从文件夹中取出存储老师对象的文件,然后反序列化出老师对象'''
return pickle.load(open(self.id, 'rb'))
tea = teacher('淡淡的悲哀','female',18,'SSS',3000)
tea.create_id() # 调用id函数
tea.tell_info() # 打印信息
tea.save()
fl = tea.get_obj_by_id()
print(fl)
# 定义学生类
class student:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
def create_id(self):
'''生成学生唯一编号的功能'''
format_time = time.strftime("%Y-%m-%d %X")
data = (format_time + self.name + str(self.age) + self.sex)
# 对data 进行哈希处理
m = hashlib.md5(data.encode('utf-8'))
self.id = m.hexdigest()
return self.id
def tell_info(self):
'''获取学生的所有信息'''
print(f'''
{self.id}
{self.name}
{self.age}
{self.sex}
''')
def save(self):
'''将学生对象序列化保存到文件里,文件名即学生的编号'''
with open(self.id, 'wb') as f:
pickle.dump(self, f)
def get_obj_by_id(self):
'''从文件夹中取出存储学生对象的文件,然后反序列化出学生对象'''
return pickle.load(open(self.id, 'rb'))
stu = student('哈哈哈哈哈','male',100)
stu.create_id() # 调用id函数
stu.tell_info() # 打印信息
stu.save()
tl = stu.get_obj_by_id()
print(tl)
6、抽象老师类与学生类得到父类,用继承的方式减少代码冗余
'''将函数体继承'''
class OldPeople:
'''定义公用基类'''
def __init__(self,name,sex,age):
'''共同具有的属性'''
self.name = name
self.sex = sex
self.age = age
'''以下为共有的方法'''
def create_id(self):
'''生成唯一编号的功能'''
format_time = time.strftime("%Y-%m-%d %X")
data = (format_time + self.name + str(self.age) + self.sex)
# 对data 进行哈希处理
m = hashlib.md5(data.encode('utf-8'))
self.id = m.hexdigest()
return self.id
# 这里解决不了打印,学生打印比老师少,变量不一样,只能放在各自的类中
# def tell_info(self):
# '''获取所有信息'''
# print(f'''
# {self.id}
# {self.name}
# {self.age}
# {self.sex}
# ''')
def save(self):
'''将对象序列化保存到文件里,文件名即编号'''
with open(self.id, 'wb') as f:
pickle.dump(self, f)
def get_obj_by_id(self):
'''从文件夹中取出存储对象的文件,然后反序列化出对象'''
return pickle.load(open(self.id, 'rb'))
'''定义学生类'''
class Student(OldPeople):
def __init__(self,name,sex,age):
'''学生类的所有参数'''
OldPeople.__init__(self,name,sex,age)
'''打印学生信息'''
def tell_info(self):
'''获取所有信息'''
print(f'''
{self.id}
{self.name}
{self.age}
{self.sex}
''')
'''定义老师类'''
class Teacher(OldPeople):
'''传入所有的参数属性'''
def __init__(self,name,sex,age,level,salary):
'''从符类中继承的属性'''
OldPeople.__init__(self,name,sex,age)
'''自定义教师类的属性'''
self.level = level
self.salary = salary
'''打印教师的信息,多了几个属性'''
def tell_info(self):
'''获取所有信息'''
print(f'''
{self.id}
{self.name}
{self.age}
{self.sex}
{self.level}
{self.salary}
''')
ter1 =Teacher('淡淡的悲哀','female',18,'SSS',3000)
ter1.create_id() # 调用id函数
ter1.tell_info() # 打印信息
ter1.save() # 进行保存
print( ter1.get_obj_by_id() )
# <__main__.Teacher object at 0x000001C3E97B7668>
stu1 = Student('哈哈哈哈哈','male',100)
stu1.create_id() # 调用id函数
stu1.tell_info() # 打印信息
stu1.save()
stu = stu1.get_obj_by_id()
print(stu)