继承
-
什么是继承?
继承指的是新建类的方法,新建的类称之为子类或者派生类
子类继承的类叫父类,也称之为基类或超类
-
继承的特点:
子类可以继承父类的属性(特征与技能),并且可以派生出自己的属性(特征与技能)
继承是类与类之间的关系
*****
(面试问)
注意:在python中,一个子类可以继承多个父类,其他语言只 能一个子类继承一个父类
-
为什么要继承?
继承的目的是为了减少代码的冗余(减少重复代码) -
如何实现继承?
首先要确定好谁是子类,谁是父类
在定义类时,子类+(),()内写父类,实现继承
使用
__bases__
方法可以获取对象继承的类 -
在python3中如果一个类没有继承任何类,则默认继承object类
-
在python2中如果一个类没有继承任何类,不会继承object类
寻找继承关系
- 如何寻找继承关系?
要想寻找继承关系,首先要“先抽象,再继承”
- 什么是抽象?
抽象指的是抽取相似的部分,称之为抽象
先抽象(抽象思想)再继承(在程序中)
- 继承的关系:
对象是特征与技能的结合体
类时一系列对象相同的特征与技能的结合体
继承是一系列类相同的特征与技能的结合体
继承背景下对象属性查找顺序
在继承背景下,对象属性的查找顺序:
- 对象查找属性会先从对象的名称空间中查找
- 若对象没有,则会取类里面找
- 若当前类是子类,并且没有对象找的属性,会去父类中查找
注意:对象查找属性,若子类有,不管父类有没有,以子类的为准
派生
什么是派生?
子类中记住子类在新定义的属性的这个过程叫做派生,并且需要记住子类在使用派生的属性时始终以自己的为准
派生指的是子类继承了父类的属性,并且派生出新的属性*****
子类派生出新的属性,若与父类的属性相同,则以子类的为准
继承是谁与谁的关系,指的是类与类的关系,子类与父类是从属关系
子类派生出新的属性,并重用父类的属性
问题:子类继承父类的__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)