day20 作業


今日作業

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM