继承(Inherit)
继承的概念
- 子类继承父类的内容,包括字段、方法、属性。
- 将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。
- 基类和派生类只是与父类、子类的叫法不一样
查看继承
class.__bases__#__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类
继承的查找顺序
先在自己对象里找,然后去类里找,最后去父类里去找
哪一个对象调用,self就是代指的哪一个对象,(父类,子类里的self,都是对象)
多继承
- Java和C#中则只能继承一个类,Python的类可以继承多个类
- Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先
- python2中分经典类和新式类,经典类为深度优先,新式类为广度优先。
- 经典类:自定义最开始的类不继承任何东西
- 新式类:自定义最开始的类继承object类
-
python3种自定义的类全部默认继承新式类,均为广度优先
- 深度优先
- 示例
- 广度优先
- 示例
在子类中重用父类的属性
方式一
指名道姓: (不依赖继承)
新方法下执行
def new(): 父类.方法() 父类.__init__() #调用父类的init方法
方式二
super() (依赖继承)
super(自己类名,self).方法() 得到一个父类的对象
super(自己类名,self).__init__()
python3简写为super().方法()
super()从mro列表当前位置往后去找,
抽象类和接口类
from abc import ABCmeta, abstractmethod
class Person(classmeta=ABCmeta)
- 抽象类:
- 在Python中,默认是有的
- 父类的方法子类必须实现
- 抽象类不能被实例化
- 抽象类内的方法可以被简单实现
- 抽象类不建议多继承
- 借口类:
- 做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象
- 在python中,默认是没有的,只是一种程序设计理念
- 接口类的方法不能被实现
- 接口隔离原则:
- 应该有多个独立的接口,而不是多功能的单个接口
- 接口类推荐使用多继承