(一)单继承
(1)方式:
class son(parent name):
(2)继承的传递性:
例:创建animal类,dog类,以及dog的子类zhtyq(中华田园犬)
class animal:
def eat(self):
return
def sleep(self):
return
def drink(self):
return
class dog(animal):
def bark(self):
print("汪汪叫")
class zhtyq(dog):
def fly(self):
print("i am flying")
这里的中华田园犬同样可以使用dog的父类animal中的方法
但是如果再建一个animal的子类cat,中华田园犬继承了dog,就无法调用cat里面的方法。
(3)继承的扩展与重写
问题引出:我们引用的父类的方法无法满足子类的要求,这时候可以在子类中重写父类的方法
1:重写
直接在子类中创建与父类方法名字一样的方法。
2:扩展
重写方法时需要调用父类的方法,运用super().方法名
例:
def bark(self):
print("嘿嘿一笑")
#super()调用父类执行
super().bark()
#其他根据需求进行改写
print("sdaasd")
(4)访问父类的私有属性与方法
子类无法继承父类的私有属性与方法,但是可以通过父类的公有方法访问父类的属性与方法
例:
class father:
def __init__(self):
self.name=1
self.__num=2
def __private(self):
print("我是私有方法")
def get_num(self):
return self.__num
def get_private(self):
self.__private()
class son(father):
pass
son1=son()
print(son1.name)
son1.get_private()
这里的get_private就是通过访问父类的公有方法访问父类的私有方法
(二)多继承
(1)方式:
class son(f1,f2,f3…)
例:
class father:
def f1(self):
print("father")
class mother:
def m1(self):
print("mother")
class son(father,mother):
pass
son1=son()
son1.f1()
son1.m1()
(2)注意:多个父类方法重名
例:
class father:
def f1(self):
print("f1---> father")
def m1(self):
print("m1---> father")
class mother:
def m1(self):
print("m1---> mother")
def f1(self):
print("f1---> mother")
class son(father,mother):
pass
son1=son()
son1.f1()
son1.m1()
结果:
f1---> father
m1---> father
总结,调用各个父类的重名方法,优先调用排名靠前的父类
尽量避免多继承
(3)搜索机制与mro
python3的搜索方法会从第一个类开始,如果找到所用的方法就不会再往后搜索
print(son.__mro__)
结果
(<class '__main__.son'>, <class '__main__.father'>, <class '__main__.mother'>, <class 'object'>)