目錄
今日作業
1、下面這段代碼的輸出結果將是什么?請解釋。
class Parent(object):
x = 1
class Child1(Parent):
pass
class Child2(Parent):
pass
print(Parent.x, Child1.x, Child2.x)
Child1.x = 2
print(Parent.x, Child1.x, Child2.x)
Parent.x = 3
print(Parent.x, Child1.x, Child2.x)
# 終端打印結果----------------------
1 1 1
1 2 1
3 2 3
# 解釋:----------------------
print(Parent.x, Child1.x, Child2.x) 打印父類、子類1、子類2的屬性x:1 1 1
Child1.x = 2 修改了Child1對象(子類)名稱空間中的x值,其他對象(Parent、Child2)不受影響的,打印:1 2 1
Parent.x = 3 修改了父類的名稱空間的屬性x值,那么子類繼承父類,對應的屬性值也會改變,Child1名稱空間修改為2,與其他對象無關,打印: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()
f = F()
# 終端打印結果----------------------
G
D
A
B
F
C
B
D
A
# 解釋:----------------------
運行G() 的打印順序:G->D->A->B
運行F() 的打印順序:F->c->B->D->A
兩者都是新式類,按照廣度優先原則
g = G():先縱觀全部類-A類和B類沒有繼承關系,首先打印G本身,然后使用super()函數調用父類D,打印D,父類D又使用super()函數調用父類A,打印A,返回至G的第二個父類B,打印B。
f = F():先縱觀全部類-C類和D類同時繼承A類,首先打印F,同理廣度優先,A類將排到最后去找。
利用mro函數可以查看繼承的順序
print(G.__mro__)
print(F.__mro__)
(<class '__main__.G'>, <class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
(<class '__main__.F'>, <class '__main__.C'>, <class '__main__.B'>, <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)
3、什么是新式類,什么是經典類,二者有什么區別?什么是深度優先,什么是廣度優先?
經典類:沒有繼承object類的,深度優先查找
新式類:繼承有object類的,廣度優先查找
區別:是否繼承object類,在多繼承的情況下繼承順序不同
經典類是縱向查找,直接繼承下去最后的一個類里面找
新式類是橫向查找,會縱觀全部類直到最后的一個類繼承有object才去里面找
4、用面向對象的形式編寫一個老師類, 老師有特征:編號、姓名、性別、年齡、等級、工資,老師類中有功能。
'''
用面向對象的形式編寫一個老師類,
老師有特征:編號、姓名、性別、年齡、等級、工資,老師類中有功能。
1.生成老師唯一編號的功能,
可以用hashlib對當前時間加上老師的所有信息進行校驗得到一個hash值來作為老師的編號
2.獲取老師所有信息
3.將老師對象序列化保存到文件里,文件名即老師的編號,提示功能如下
4.從文件夾中取出存儲老師對象的文件,然后反序列化出老師對象,提示功能如下
5、按照定義老師的方式,再定義一個學生類
'''
import pickle
import hashlib
# 6、抽象老師類與學生類得到父類,用繼承的方式減少代碼冗余
class People(object):
def __init__(self,name,sex,age):
self.name = name
self.sex =sex
self.age = age
# 老師類
class Teacher(People):
def __init__(self,name,sex,age,level,salary):
super().__init__(name,sex,age)
self.level = level
self.salary = salary
# 1.生成老師唯一編號的功能,
def create_id(self):
str = self.name + self.sex + self.age + self.level + self.salary
self.id = hashlib.md5(str.encode("utf8")).hexdigest()
return self.id
# 2.獲取老師所有信息
def tell_info(self):
info = f"""
老師編號 {self.id}
老師名字 {self.name}
老師性別 {self.sex}
老師年齡 {self.age}
老師等級 {self.level}
老師薪資 {self.salary}
"""
return info
# 3.將老師對象序列化保存到文件里,文件名即老師的編號,提示功能如下
def save(self):
file = f"{self.id}_{self.name}" + ".pick"
tea_dic = {
"name": self.name,
"sex": self.sex,
"age": self.age,
"level": self.level,
"salary": self.salary
}
with open(file, 'wb') as f:
pickle.dump(tea_dic, f)
# 文件名 9fd0ebd7fa0e6abd13066063db3a5bbb_tank.pick
# 4.從文件夾中取出存儲老師對象的文件,然后反序列化出老師對象,提示功能如下
def get_obj_by_id(self):
file = f"{self.id}_{self.name}" + ".pick"
with open(file,"rb") as f:
data = pickle.load(f)
print(data.get("name"))
tea1 = Teacher("tank","男","18","10","3000")
# 1.生成老師唯一編號的功能,
# 可以用hashlib對當前時間加上老師的所有信息進行校驗得到一個hash值來作為老師的編號
id = tea1.create_id()
print(id)
# 2.獲取老師所有信息
info = tea1.tell_info()
print(info)
# 3.將老師對象序列化保存到文件里,文件名即老師的編號,提示功能如下
tea1.save()
# 4.從文件夾中取出存儲老師對象的文件,然后反序列化出老師對象,提示功能如下
tea1.get_obj_by_id()
# 學生類
class Student(People):
def __init__(self,name,sex,age,course):
super().__init__(name,sex,age)
self.course = course
# 1.生成學生唯一編號的功能,
def create_id(self):
str = self.name + self.sex + self.age + self.course
self.id = hashlib.md5(str.encode("utf8")).hexdigest()
return self.id
# 2.獲取學生所有信息
def tell_info(self):
info = f"""
學生編號 {self.id}
學生名字 {self.name}
學生性別 {self.sex}
學生年齡 {self.age}
學生課程 {self.course}
"""
return info
# 3.將學生對象序列化保存到文件里,文件名即學生的編號,提示功能如下
def save(self):
file = f"{self.id}_{self.name}" + ".pick"
stu_dic = {
"name": self.name,
"sex": self.sex,
"age": self.age,
"course": self.course,
}
with open(file, 'wb') as f:
pickle.dump(tea_dic, f)
# 4.從文件夾中取出存儲學生對象的文件,然后反序列化出學生對象,提示功能如下
def get_obj_by_id(self):
file = f"{self.id}_{self.name}" + ".pick"
with open(file,"rb") as f:
data = pickle.load(f)
print(data.get("name"))
stu1 = Student("qinyj","男","18","python")
# 1.生成學生唯一編號的功能,
# 可以用hashlib對當前時間加上學生的所有信息進行校驗得到一個hash值來作為學生的編號
id = stu1.create_id()
print(id)
# 2.獲取學生所有信息
info = stu1.tell_info()
print(info)
# 3.將學生對象序列化保存到文件里,文件名即學生的編號,提示功能如下
stu1.save()
# 4.從文件夾中取出存儲學生對象的文件,然后反序列化出學生對象,提示功能如下
stu1.get_obj_by_id()
終端打印:
9fd0ebd7fa0e6abd13066063db3a5bbb
老師編號 9fd0ebd7fa0e6abd13066063db3a5bbb
老師名字 tank
老師性別 男
老師年齡 18
老師等級 10
老師薪資 3000
tank
50450f287fbf32935f348f056dd088c3
學生編號 50450f287fbf32935f348f056dd088c3
學生名字 qinyj
學生性別 男
學生年齡 18
學生課程 python
qinyj