「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战」
面向对象三要素之一,继承!
继承:
可以处理功能的迭代更新,以及拓展
重用代码,方便代码的管理和修改。
在面向对象的世界中,从父类继承,就可以直接拥有父类的属性和方法,这样可以减少代码,多复用,子类可以定义自己的属性和方法
类名.bases 可以查看类的父类有哪些,注意要print。
每一个类,如果你不写继承,那么这个类继承的就是object。
class Father(object): #object默认自动创建了__init__初始化方法
#父类
pass
fa = Father() #实例,自动调用父类的__init__ 初始化方法就叫做继承。
例子:
class Father: 父类
def eat(self):
print('大吃一顿')
class Son1(Father): #子类Son1继承父类Father
pass
hansha = Son1()
hansha.eat() #子类Son1可以使用父类Father中的eat方法。
高级的来咯!!!
多继承:::
多继承优先级:从左往右,优先级由高到低。
如果继承的两个父类有同样的方法,那么会选择优先级高的方法,即子类会优先使用最先被继承的方法。
class Father:
def __init__(self,name,age):
self.name = name
def eat(self):
print('大吃一顿')
class Mother:
def __init__(self,name,age,sex):
self.name = name
def cook(self):
print('做菜')
class Son(Father,Mother):
pass
hansha = Son('寒沙',18)
hansha.eat()
hansha.cook()
最高级的来啦!!!
class Base:
def play(self):
print('这是Base')
class A(Base):
def play(self):
print('这是A')
super().play() #这里调用的是Base
class B(Base):
def play(self):
print('这是B')
super().play() #这里调用的是Base
class C(A,B):
#当子类继承父类之后,如果子类不想使用父类的方法,可以通过重写来覆盖父类的方法
def play(self):
print('这是C')
# #重写父类方法之后,如果又需要使用父类的方法:
# B().play() #第一种方法 实例化,再使用方法
# A.play(self) #第二种方法 类名使用这个方法
super().play() #这里调用的是A
c = C()
c.play()
print(C.__mro__) #可以通过调用类的__mro__属性或者mro方法来查看类的继承关系
输出为(<class 'main.C'>, <class 'main.A'>, <class 'main.B'>, <class 'main.Base'>, <class 'object'>)
super可以使用父类的方法;在父类中也可以使用super函数;要满足mro算法规则
根据mro的顺序来决定调用的是谁
在python3中,类被创建时会自动创建方法解析顺序mro
mro顺序 算法 保证程序能够按序执行。
mro顺序的作用:
#保证所有的类在用(构造)他的时候只被用(构造)一次!
保证多继承的时候,每个类只出现一次。
super().init() 相当于使用了mro。