继承

  • 什么是继承?

    继承指的是新建类的方法,新建的类称之为子类或者派生类

    子类继承的类叫父类,也称之为基类或超类

  • 继承的特点:

    子类可以继承父类的属性(特征与技能),并且可以派生出自己的属性(特征与技能)

​ 继承是类与类之间的关系

*****(面试问)

​ 注意:在python中,一个子类可以继承多个父类,其他语言只 能一个子类继承一个父类

  • 为什么要继承?
    继承的目的是为了减少代码的冗余(减少重复代码)

  • 如何实现继承?

    首先要确定好谁是子类,谁是父类

    在定义类时,子类+(),()内写父类,实现继承

    使用__bases__方法可以获取对象继承的类

  • 在python3中如果一个类没有继承任何类,则默认继承object类

  • 在python2中如果一个类没有继承任何类,不会继承object类

寻找继承关系

  • 如何寻找继承关系?

​ 要想寻找继承关系,首先要“先抽象,再继承”

  • 什么是抽象?

​ 抽象指的是抽取相似的部分,称之为抽象

​ 先抽象(抽象思想)再继承(在程序中)

  • 继承的关系:
    对象是特征与技能的结合体

​ 类时一系列对象相同的特征与技能的结合体

​ 继承是一系列类相同的特征与技能的结合体

继承背景下对象属性查找顺序

在继承背景下,对象属性的查找顺序:

  1. 对象查找属性会先从对象的名称空间中查找
  2. 若对象没有,则会取类里面找
  3. 若当前类是子类,并且没有对象找的属性,会去父类中查找

注意:对象查找属性,若子类有,不管父类有没有,以子类的为准

派生

什么是派生?

​ 子类中记住子类在新定义的属性的这个过程叫做派生,并且需要记住子类在使用派生的属性时始终以自己的为准

​ 派生指的是子类继承了父类的属性,并且派生出新的属性*****

​ 子类派生出新的属性,若与父类的属性相同,则以子类的为准

​ 继承是谁与谁的关系,指的是类与类的关系,子类与父类是从属关系

子类派生出新的属性,并重用父类的属性

问题:子类继承父类的__init__毫无意义

解决:

解决的方式有两种:

方式一:

​ 直接通过父类"."(调用)__init____init__当做普通的函数使用,传入对象与继承的属性

方式二:

​ super

​ 严格以来继承属性查找关系

​ super()会得到一个特殊的对象,该对象就是专门用来访问父类中的属性的(按照继承的关系)

​ super().__init__(不用为self传值)

​ super()的完整用法是super(自己的类名,self),在python2中需要写完整,在python3中可以简写为super()

新式类和经典类

新式类:

​ 继承了object的类以及该类的子类,都是新式类

​ python3中所有的类都是新式类,子类不继承自定义的类,默认继承object

经典类:

​ 没有继承object的类以及该类的子类,都是经典类

​ 只有python2中才有经典类

mro():属于object——》type的函数,用来查看当前类的继承顺序,在多继承的情况下

菱形继承

钻石继承也可以称之为菱形继承.(了解)面试可能会问

在多继承的情况下形成的钻石继承(继承顺序)

​ 经典类

​ 深度优先

​ 一条路走到黑,深度优先

​ 新式类

​ 广度优先

通过继承实现修改json模块数据类型

import json
from datetime import date,datetime
print(json.JSONEncoder)
print(datetime.today())#当前时间
print(date.today())#当前日期
class MyJson(json.JSONEncoder):
    def default(self, o):
        #子类派生的功能
        #判断o是否datetime的一个实例
        if isinstance(o,datetime):
            return o.strftime('%Y-%m-%d %X')
        elif isinstance(o,date):
            return o.strftime('%Y-%m-%d')
        else:
            #继承父类的default方法的功能
            return super().default(self,o)
dict1 = {
    'name':'tank',
    'today':datetime.today(),
    'today2':date.today()
}
res = json.dumps(dict1,cls=MyJson)#cls=None,默认指向的时原json的JSONEncoder
print(res)