zoukankan      html  css  js  c++  java
  • 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}
            ''')
    
  • 相关阅读:
    118/119. Pascal's Triangle/II
    160. Intersection of Two Linked Lists
    168. Excel Sheet Column Title
    167. Two Sum II
    172. Factorial Trailing Zeroes
    169. Majority Element
    189. Rotate Array
    202. Happy Number
    204. Count Primes
    MVC之Model元数据
  • 原文地址:https://www.cnblogs.com/bigb/p/11650707.html
Copyright © 2011-2022 走看看