Python3 類的繼承小練習


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

第一行: 子類會繼承父類的屬性

第二行: Child1.x = 2Child1類添加了派生屬性, 屬性的搜索順序是先子類后父類

第三行: Parent.x = 3修改了父類的屬性, Child2繼承了Parentx屬性, Child1優先使用自身的x屬性

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

  1. 調用類會自動觸發__init__函數
  2. 新式類的多重繼承按從左到右, 廣度優先的順序搜索

3、什么是新式類,什么是經典類,二者有什么區別?什么是深度優先,什么是廣度優先?

  1. 新式類: 所有繼承object的類及其子類都是新式類
  2. 經典類: Python2沒有繼承object的類及其子類都是經典類
  3. 深度優先: 當類經典類時, 多重繼承時, 會按深度優先的方式查找
  4. 廣度優先: 當類是新式類時, 多重繼承時, 會按廣度優先的方式查找

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 PyTeacher:
    def __init__(self, name, gender, age, level, salary):
        self.name = name
        self.gender = gender
        self.age = age
        self.level = level
        self.salary = salary
        self.id = self.creat_id()

    def creat_id(self):
        raw_id = str(time.time()) + self.name + self.gender + str(self.age) + str(self.level) + str(self.salary)
        id = hashlib.md5(raw_id.encode()).hexdigest()
        return id

    def teach(self):
        print('teaching Python...')

    def tell_info(self):
        print(f'ID:{teacher.id}, name:{teacher.name}, gender:{teacher.gender}, age:{teacher.age}, level:{teacher.level}, salary:{teacher.salary}')

    def save(self):
        with open(self.id, 'wb') as f:
            pickle.dump(self, f)
            print('done!')

    def get_obj_by_id(self):
        return pickle.load(open(self.id, 'rb'))


teacher = PyTeacher('龜叔', 'male', 18, 10, 0)


# 學生類
class PyStudent:
    def __init__(self, name, gender, age, class_no, score):
        self.name = name
        self.gender = gender
        self.age = age
        self.class_no = class_no
        self.score = score
        self.id = self.creat_id()

    def creat_id(self):
        raw_id = str(time.time()) + self.name + self.gender + str(self.age) + str(self.class_no) + str(self.score)
        id = hashlib.md5(raw_id.encode()).hexdigest()
        return id

    def learn(self):
        print('learning Python...')

    def tell_info(self):
        print(f'''
        ID:{self.id}, 
        name:{self.name}, 
        gender:{self.gender}, 
        age:{self.age}, 
        class:{self.class_no}, 
        score:{self.score}
        ''')

    def save(self):
        with open(self.id, 'wb') as f:
            pickle.dump(self, f)
            print('done!')

    def get_obj_by_id(self):
        return pickle.load(open(self.id, 'rb'))

5、抽象老師類與學生類得到父類,用繼承的方式減少代碼冗余

class PyMan:
    language = 'Python'

    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
    
    def save(self):
        with open(self.id, 'wb') as f:
            pickle.dump(self, f)
            print('done!')

    def get_obj_by_id(self):
        return pickle.load(open(self.id, 'rb'))


# 老師類
class PyTeacher(PyMan):
    def __init__(self, name, age, gender, level, salary):
        super().__init__(self, name, age, gender)
        self.level = level
        self.salary = salary
        self.id = self.creat_id()

     def creat_id(self):
        raw_id = str(time.time()) + self.name + self.gender + str(self.age) + str(self.level) + str(self.salary)
        id = hashlib.md5(raw_id.encode()).hexdigest()
        return id

    def teach(self):
        print('teaching Python...')

    def tell_info(self):
        print(f'''
        ID:{teacher.id},
        name:{teacher.name},
        gender:{teacher.gender},
        age:{teacher.age},
        level:{teacher.level},
        salary:{teacher.salary}
        ''')


# 學生類
class PyStudent(PyMan):
    def __init__(self, name, age, gender, class_no, score):
        super().__init__(self, name, age, gender)
        self.class_no = class_no
        self.score = score
        self.id = self.creat_id()
       
        
    def learn(self):
        print('learning Python...')

    def tell_info(self):
        print(f'''
        ID:{self.id},
        name:{self.name}, 
        gender:{self.gender},
        age:{self.age},
        class:{self.class_no},
        score:{self.score}
        ''')


免責聲明!

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



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