在程序中,从设计角度讲,先有子类再有父类
从编码角度讲,先有父类后有子类
多个类型中,有代码的共性,且都属于一个概念
例如:
class Person:
Def say(self):
Print(“说话”)
class Teacher(Person):
Def teach(self):
Self.say()
Print(“教学”)
class Student(Person):
Def study(self):
print(“学习”)
创建父类对象,只能访问父类成员
p=Person()
p.say()
创建子类对象
t=Teacher()
t.say()
t.teach()
关系判断
isinstance(变量名,类型名)函数
以上例子
本类对象是一种本类类型
子类对象是一种父类类型
issubclass(类型名,类型名)
逻辑与上面函数相同
type(变量名)==类型名
只有本类对象名才会返回true
继承中的数据
1.子类若没有构造函数,直接使用父类
2.子类有构造函数,覆盖父类(好像父类中不存在构造函数)
super()通过父类调用构造函数
super().__init__(父类参数)
任何类都直接或间接继承object类
多继承:拥有多个父类
class A:
def func01(self):
print("func01")
class B:
def func02(self):
print("func02")
class C(B,C):
def func03(self):
self.func01()
self.func02()
优点:最简单的代码复用方式
缺点:增加新类型,必须改变C类代码
class A:
def func01(self):
print("A--func01")
class B:
def func01(self):
print("B--func01")
class C(B,C):
def func01(self):
print("C--func01")
super().func01()
c=C()
c.func01()
super找到的是A,父类有相同函数名时在继承列表中从左至右查找
无法执行B类中func01()
class A:
def func01(self):
print("A--func01")
class B(A):
def func01(self):
print("B--func01")
super().func01()
class C(A):
def func01(self):
print("C--func01")
class D(B,C):
def func01(self):
print("D--func01")
super().func01()
d=D()
d.func01()
执行顺序为:D->B->C
可以使用print(D.mro())来查看函数调用顺序
Java,c#等新语言都只支持单继承,单继承是重点