继承:
- 被继承的类是父类(基类),继承的类是子类
- 通过继承基类来获取基类的功能
- 子类有父类所有的属性和方法
- 父类没有子类独有的属性和方法
- 自定义的类默认继承object类
用法:
- 定义子类时,将父类传入子类参数内
- 子类实例化,可以调用自己独有的和父类的属性和方法
- 父类无法调用子类的属性和方法
例:
# 父类
class Parent():
def __init__(self, name = '张三'):
self.name = name
def p1(self):
return '父类'
# 子类
class Child1(Parent):
def c1(self):
return '子类'
# 实例化
c = Child1()
# 调用父类的属性
print(c.name)
# 调用父类的函数
print(c.p1())
# 调用子类的函数
print(c.c1())
结果:
super函数
- 子类继承父类的方法时使用
- 在子类中可以调用父类的方法
- 使用:super(当前类名,self)
例:
# 父类
class Parent():
def __init__(self, p):
self.p = p
print('父类')
def p1(self):
print(f'父类p1:{self.p}')
def p2(self, a):
print(f'父类p2:{a}')
# 子类
class Child1(Parent):
def __init__(self, c, p):
#super(Child1,self).__init__(p),super中的参数可以省略
super().__init__(p) # 使用super调用父类中的构造方法
self.c = c
print('子类')
def c1(self, a):
super().p1() # 使用super调用父类中的方法p1
super().p2(a) # 使用super调用父类中的方法p2
print(f'父类:{self.c}')
# 实例化
c = Child1('子','父')
print('----------')
c.c1('aa')
结果:
多态
- 子类中重写父类的方法
- 子类中某个函数名与父类中的函数名的相同,但是功能不同
例:
# 父类
class Parent():
def like(self):
print('父亲喜欢橘子')
# 子类 ,重写父类方法like
class Xiaoming(Parent):
def like(self):
print('小明喜欢苹果')
son = Xiaoming()
son.like()
father = Parent()
father.like()
结果:
多重继承
- 子类可以同时继承多个父类,拥有多个父类的属性和方法
例:
# 父类1
class Father():
def like(self):
print('喜欢橘子')
def dump(self):
print('会跳')
# 父类2
class Mother():
def like(self):
print('喜欢苹果')
def run(self):
print('会跑')
# 子类 ,继承多个父类
class Xiaoming(Father, Mother):
pass
son = Xiaoming()
son.dump()
son.run()
# 父类是从左向右继承,所以先继承Father再继承Mother
# 此函数like在2个父类中都有,且功能不同
son.like()
# 类名.__mro__,可以打印此类的继承逻辑
print(Xiaoming.__mro__)
结果:
总结:
- 多个父类,根据传入的父类名称从左向右开始继承,根据最后一句打印,可以看出是先继承Father再继承Mother,object是前面2个父类继承的,相当于在此类最右边
- 若是多个父类中有相同的方法,根据倒数第二句打印的是父类Father的功能可知:多个父类,有多个相同函数名,最终继承的是从左到右数的第一个有此函数的类
- 继承多个父类,拥有所有这些父类的属性和函数