1、下面这段代码的输出结果将是什么?请解释。

class Parent(object):
    x = 1

class Child1(Parent):
    pass

class Child2(Parent):
    pass

print(Parent.x, Child1.x, Child2.x)

# 输出结果为:1,1,1,
# 原因:Child1和Child2的父类都是Parent,且其中均没有变量x,因此都会找到Parent中的变量x值

Child1.x = 2
print(Parent.x, Child1.x, Child2.x)

# 输出结果为:1,2,1
# 原因:此时Child2中有了x变量,在查找属性时,子类中找到就不会从父类中再找了

Parent.x = 3
print(Parent.x, Child1.x, Child2.x)

# 输出结果为:3,2,3
# 原因:父类Parent中x变量改变,相应,Child2也会输出父类中的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

原因:在新式类中,会遵循广度优先的搜索顺序

  • 在给G()中因为后续的类没有再指向A的父类,因此会直接查找到A,B是最后一个后续的类,因此会直接查找到B
  • 再F()中存在后续的D类会指向类A,因此再C之后不会再去A中查找
  • 而直接去B中查找,后续的类D指向的不是类B,因此会直接去B中查找
  • D是最后一个后续的类,因此会去指向object的类A中查找

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

  • 继承object的类以及其子类成为新式类
  • 没有继承object的类以及其子类成为经典类
  • python3中所有的类默认继承object,因此都是新式类
  • 只有在python2中才有经典类的存在
  • 多继承情况下,当类是经典类时,按照深度优先查找;当类是新式类时按照广度优先查找
  • 深度优先是指:在首轮查找时,会直接查找到最后一个的父类,后续的查找便会默认不去最后一个父类查找
  • 广度优先是指:如果在继承的类中,由多个指向最后一个父类的类,那么只会在最后一个继承的类的查找时会去那个最后一个父类中的查找

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 pickle
import hashlib
import time

class Teacher:
    def __init__(self,name,sex,age,level,sal):
        self.name = name
        self.sex = sex
        self.age = age
        self.level = level
        self.sal = sal

    def create_id(self):
        time_now = time.time()
        teach_str = str(time_now) + self.name +  self.sex + str(self.age) + self.level + str(self.sal)
        id = hashlib.md5(teach_str.encode('utf-8')).hexdigest()
        self.id = id

    def tell_info(self):
        print(f'''
        编号:{self.id}
        姓名:{self.name}
        性别:{self.sex}
        年龄:{self.age}
        等级:{self.level}
        薪资:{self.sal}''')

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

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

tea = Teacher('wick','男',24,'牛逼',10000)
tea.create_id()
tea.tell_info()

class Student:
    def __init__(self,name,sex,age,duty,grade):
        self.name = name
        self.sex = sex
        self.age = age
        self.duty = duty
        self.grade = grade

    def create_id(self):
        time_now = time.time()
        teach_str = str(time_now) + self.name +  self.sex + str(self.age) + self.duty + str(self.grade)
        id = hashlib.md5(teach_str.encode('utf-8')).hexdigest()
        self.id = id

    def tell_info(self):
        print(f'''
        学号:{self.id}
        姓名:{self.name}
        性别:{self.sex}
        年龄:{self.age}
        职务:{self.duty}
        成绩:{self.grade}''')

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

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

stu = Student('阿峰','人妖',35,'学生','奇差无比')
stu.create_id()
stu.tell_info()

6、抽象老师类与学生类得到父类,用继承的方式减少代码冗余

import pickle
import hashlib
import time

class People:
    def __init__(self,name,sex,age):
        self.name = name
        self.sex = sex
        self.age = age
        self.id = self.create_id()
    def create_id(self):
        time_now = time.time()
        teach_str = str(time_now) + self.name +  self.sex + str(self.age)
        id = hashlib.md5(teach_str.encode('utf-8')).hexdigest()
        self.id = id

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

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

class Teacher(People):
    def __init__(self,name ,sex,age,level,sal):
        super().__init__(name,sex,age)
        self.level = level
        self.sal = sal

    def tell_info(self):
        print(f'''
        编号:{self.id}
        姓名:{self.name}
        性别:{self.sex}
        年龄:{self.age}
        等级:{self.level}
        薪资:{self.sal}''')

class Student(People):
    def __init__(self,name ,sex,age,duty,grade):
        super().__init__(name,sex,age)
        self.duty = duty
        self.grade = grade

    def tell_info(self):
        print(f'''
        学号:{self.id}
        姓名:{self.name}
        性别:{self.sex}
        年龄:{self.age}
        职务:{self.duty}
        成绩:{self.grade}''')

tea = Teacher('wick','男',24,'牛逼',15000)
stu = Student('阿峰','人妖',35,'学生','奇差无比')

tea.create_id()
stu.create_id()
tea.tell_info()
stu.tell_info()

day20作业的更多相关文章

  1. Day20作业及默写

    1.请使用C3算法计算出链接图中的继承顺序-Link 一 graph BT id1[A]-->id2[B] id2[B]-->id6[F] id6[F]-->id7[G] id1[A ...

  2. day20 作业

    目录 今日作业 1.下面这段代码的输出结果将是什么?请解释. 2.多重继承的执行顺序,请解答以下输出结果是什么?并解释. 3.什么是新式类,什么是经典类,二者有什么区别?什么是深度优先,什么是广度优先 ...

  3. day20模块作业

    1.模块化作业 1.回顾文件递归遍历. 默写一遍. 入口在: 当文件是个文件夹的时候 出口在: 文件是一个文件 2.计算时间差(用户输入起始时间和结束时间. 计算时间差(小时), 例如, 用户输入20 ...

  4. day20 project+查看新闻列表 + 点赞 + 图片验证码 + 评论和多级评论 + 后台管理 + webSocket + kindEditor

    Day20回顾: 1. 请求生命周期 2. 中间件 md = [ "file_path.classname" ] process_request[可有可无] process_res ...

  5. python 作业

    Linux day01 计算机硬件知识整理 作业要求:整理博客,内容如下 编程语言的作用及与操作系统和硬件的关系 应用程序->操作系统->硬件 cpu->内存->磁盘 cpu与 ...

  6. python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)

    类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...

  7. SQLServer2005创建定时作业任务

    SQLServer定时作业任务:即数据库自动按照定时执行的作业任务,具有周期性不需要人工干预的特点 创建步骤:(使用最高权限的账户登录--sa) 一.启动SQL Server代理(SQL Server ...

  8. 使用T-SQL找出执行时间过长的作业

        有些时候,有些作业遇到问题执行时间过长,因此我写了一个脚本可以根据历史记录,找出执行时间过长的作业,在监控中就可以及时发现这些作业并尽早解决,代码如下:   SELECT sj.name , ...

  9. T-SQL检查停止的复制作业代理,并启动

        有时候搭建的复制在作业比较多的时候,会因为某些情况导致代理停止或出错,如果分发代理时间停止稍微过长可能导致复制延期,从而需要从新初始化复制,带来问题.因此我写了一个脚本定期检查处于停止状态的分 ...

随机推荐

  1. 暑期——第三周总结(Ubuntu系统安装eclipse问题【已解决】)

    所花时间:7天 代码行:200(python)+150(java) 博客量:1篇 了解到知识点 : 一: Python: 问题 unresolved reference xrange 解决方案 pyt ...

  2. Spring 梳理-容器(container)

    虽然Spring的组件代码是轻量级的,但它的配置却是重量级的.一开始,Spring用XML配置,而且是很多XML配置.Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显 ...

  3. 手把手创建gulp

    这几天安装gulp踩了不少坑,现在讲解一个入门的案例解析: ==首先大家要确保node.npm.npx.gulp安装是否成功 == 这些安装都是傻瓜式安装,大家可以找到相应的教材. 创建一个自己的文件 ...

  4. Flask基础(05)-->路由的基本定义

    # 导入Flask from flask import Flask # 创建Flask的应用程序 app = Flask(__name__) # http://127.0.0.1:5000/123或者 ...

  5. 玩转 SpringBoot 2 之整合 JWT 上篇

    前言 该文主要带你了解什么是 JWT,以及JWT 定义和先关概念的介绍,并通过简单Demo 带你了解如何使用 SpringBoot 2 整合 JWT. 介绍前在这里我们来探讨一下如何学习一门新的技术, ...

  6. phaser学习总结之phaser入门教程

    前言 最近公司做项目的时候正好使用到phaser,在这里做一下自己整理出来的一些心得,方便大家参考,phaser这一个游戏引擎通常是做2d游戏的,入门也非常简单,只需你会一点的javascript,但 ...

  7. Centeos7搭建selenium+Chrome浏览器

    博主主要是用来更新爬虫Cookie 环境安装 python3 安装selenium pip3 install selenium 安装chrome浏览器+chromedriver驱动 一.配置yum源 ...

  8. YiShaAdmin,基于.NET Core Web开源的后台快速开发框架

    YiShaAdmin YiShaAdmin 基于.NET Core Web开发,借鉴了很多开源项目的优点,让你开发Web管理系统和移动端Api更简单,所以我也把她开源了. 她可以用于所有的Web应用程 ...

  9. 不吹不黑,今天我们来聊一聊 Kubernetes 落地的三种方式

    作者 | 王国梁  Kubernetes 社区成员与项目维护者原文标题<Kubernetes 应用之道:让 Kubernetes落地的"三板斧">,首发于知乎专栏:进击 ...

  10. 如何配置VMware客户虚拟机使用NAT模式联网通信

    本例中配置客户虚拟机(CentOS)使用NAT(网络地址转换Network Address Translation)模式进行联网到公网(互联网).客户机网段为192.168.1.0/24网段,经NAT ...