zoukankan      html  css  js  c++  java
  • day 20 作业

    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	# 此时所有子类都没有x,只能去父类中找,所以都是父类的x,此时父类x=1
    1 2 1	# 这时修改Child1的x,所以只有Child1中的x改变了
    1 2 3	# 这时Child2d的x也被修改了,但Child1中的x在上面已经被改过,所以对比上行的输出只有Child2改变
    

    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类所以先从G中运行打印G
    D  # 由于G先继承了D,所以这是找到了D类,打印D
    A  # 由于D又继承了A ,所以找到了A类,打印A
    B  # 这时G继承的第一个D类找完了,接着找第二个继承的类B,并打印B
    F  # 这时g已经结束,f调用了F类,打印F
    C  # F第一个继承的父类为C,所以找到了C,并打印C
    B  # 此时虽然C继承了A类,但是后面一个父类D也继承了A类,此时python3遵循广度优先所以并没有打印A,而是找第二个继承的父类B,打印B
    D  # 这时回来继续找第三个父类D,打印D
    A  # D类继承了A类,打印A
    

    3、什么是新式类,什么是经典类,二者有什么区别?什么是深度优先,什么是广度优先?

    新式类就是继承了object的类,经典类就是python2中没有继承object的类,python3中默认继承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、按照定义老师的方式,再定义一个学生类
        
    
    6、抽象老师类与学生类得到父类,用继承的方式减少代码冗余
    
    # 老师类
    import hashlib
    import time
    import pickle
    
    
    class Teacher:
       
        def __init__(self, number, name, sex, age, grade, salary):
            self.unmber = number
            self.name = name
            self.sex = sex
            self.age = age
            self.grade = grade
            self.salary = salary
    
        # 1.生成老师唯一编号的功能,可以用hashlib对当前时间加上老师的所有信息进行校验得到一个hash值来作为老师的编号
        def create_id(self):
            md5 = hashlib.md5()
            creat_teacher_id = f'{self.unmber},{self.name},{self.sex},{self.age},{self.grade},{self.salary}'
            day_time = time.strftime("%Y-%m-%d %X")
            creat_id = creat_teacher_id + day_time
            md5.update(creat_id.encode('utf8'))
            self.id = md5.hexdigest()
            print(self.id)
            return self.id
    
        # 2.获取老师所有信息 
        def tell_info(self):
            self.teacher_msg = f'编号:{self.unmber}
    姓名:{self.name}
    性别{self.sex}
    年龄:{self.age}
    等级:{self.grade}
    工资:{self.salary}'
            return self.teacher_msg
    
        # 3.将老师对象序列化保存到文件里,文件名即老师的编号
        def save(self):
            with open(f'{Teacher.create_id(self)}.pkl', 'wb') as f:
                pickle.dump(self, f)
    
        # 4.从文件夹中取出存储老师对象的文件,然后反序列化出老师对象
        def get_obj_by_id(self, id):
            return pickle.load(open(f'{id}.pkl','rb'))
        
        
        
        
        
        # 5、按照定义老师的方式,再定义一个学生类
        
        class Student:
        def __init__(self, number, name, sex, age):
            self.unmber = number
            self.name = name
            self.sex = sex
            self.age = age
    
    
        def create_id(self):
            md5 = hashlib.md5()
            creat_teacher_id = f'{self.unmber},{self.name},{self.sex},{self.age}'
            day_time = time.strftime("%Y-%m-%d %X")
            creat_id = creat_teacher_id + day_time
            md5.update(creat_id.encode('utf8'))
            self.id = md5.hexdigest()
            print(self.id)
            return self.id
    
        def tell_info(self):
            self.teacher_msg = f'编号:{self.unmber}
    姓名:{self.name}
    性别{self.sex}
    年龄:{self.age}'
            return self.teacher_msg
    
        def save(self):
            with open(f'{Student.create_id(self)}.pkl', 'wb') as f:
                pickle.dump(self, f)
    
        def get_obj_by_id(self, id):
            return pickle.load(open(f'{id}.pkl','rb'))
        
        
        
        # 6、抽象老师类与学生类得到父类,用继承的方式减少代码冗余
        class School:
        def __init__(self, number, name, sex, age):
            self.unmber = number
            self.name = name
            self.sex = sex
            self.age = age
    
        def create_id(self):
            md5 = hashlib.md5()
            creat_teacher_id = f'{self.unmber},{self.name},{self.sex},{self.age}'
            day_time = time.strftime("%Y-%m-%d %X")
            creat_id = creat_teacher_id + day_time
            md5.update(creat_id.encode('utf8'))
            self.id = md5.hexdigest()
            print(self.id)
            return self.id
    
        def tell_info(self):
            self.School_msg = f'编号:{self.unmber}
    姓名:{self.name}
    性别{self.sex}
    年龄:{self.age}'
            return self.School_msg
    
        def save(self):
            with open(f'{School.create_id(self)}.pkl', 'wb') as f:
                pickle.dump(self, f)
    
        def get_obj_by_id(self, id):
            return pickle.load(open(f'{id}.pkl','rb'))
    
    
    
  • 相关阅读:
    异常处理的设计和重构学习一
    设计模式之禅之六大设计原则-里氏替换原则
    设计模式之禅之六大设计原则-单一职责原则
    swagger-ui生成api文档并进行测试
    功能强大的swagger-editor的介绍与使用
    swagger-codegen自动生成代码工具的介绍与使用
    Swagger使用教程大全,从入门到精通
    Linux下MySQL的数据文件存放位置
    JUC组件扩展(三):BlockingQueue(阻塞队列)详解
    http_load的安装及使用方法
  • 原文地址:https://www.cnblogs.com/LZF-190903/p/11650817.html
Copyright © 2011-2022 走看看