抽象
要找出类与类之间的继承关系,需要先抽象,再继承
抽象即总结相似之处,总结对象之间的相似之处得到的类就是父类
类与类之间的继承指的是'什么'是'什么'(博大精深,自己体会这两个什么)
比如:人类分支:男人,女人;男人又分支小明,小红,中国男人,外国男人,非洲男人等;那么人类就是男人的父类,而男人又是中国男人,外国男人,非洲男人的父类
再比如动物类:人类,狗,猪,猴等等;那么动物类是人类,猪,够分类的父类等等
继承
继承是一种新建类的方式,新建的类称之为子类,被继承的类称之为父类\基类\超类
class OldboyPeople:
school = 'oldboy'
class Student(OldboyPeople):
def init(self,name,age,gender,stud_id):
self.name = name
self.age = age
self.gender = gender
self.id = stud_id
class Teacher(OldboyPeople):
def init(self,name,age,gender,salary):
self.name = name
self.age = age
self.gender = gender
self.salaru = salary
obj1 = Student('shuai',18,'male',4657) # 学生信息
obj2 = Teacher('eogn',18,'female',40000) # 老师信息
可以看到学生类和老师的类都继承了学校的类,因为老师和学生都是一个学校的
print(obj2.school) # 老师对象里面继承了学校类里面学校属性
print(obj1.school) # 学生对象里面继承了学校类里面学校属性
但是这样明显是不够的,因为name,age,gender这两个信息在学生和老师都存在,这就出现了重复代码问题
为何要有继承:子类会遗传父类的属性,所以继承是用来解决类与类之间代码冗余的问题
class OldboyPeople:
school = 'oldboy'
def init(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
class Student(OldboyPeople):
def init(self,name,age,gender,stud_id):
OldboyPeople.init(self,name,age,gender)
self.id = stud_id
class Teacher(OldboyPeople):
def init(self,name,age,gender,salary):
OldboyPeople.init(self,name,age,gender)
self.salaru = salary
obj1 = Student('shuai',18,'male',4657) # 学生信息
obj2 = Teacher('eogn',18,'female',40000) # 老师信息
可以看到学生类和老师的类都继承了学校的类,因为老师和学生都是一个学校的,且姓名,年龄,性别三个数据都在学校类中
print(obj2.name) # 老师对象里面继承了学校类里面名字属性 # eogn
print(obj1.name) # 学生对象里面继承了学校类里面名字属性 # shuai
通过内置属性bases可以查看到类继承的所有父类
class Parent1:
x = 123
pass
class Parent2(Parent1):
y = 456
pass
class Parent3(Parent2, Parent1):
z = 789
pass
print(Parent3.bases) # 查看类3继承的父类
(<class 'main.Parent2'>, <class 'main.Parent1'>)
python支持多继承,也就是说一个类可以同时继承两个父类(飞机是交通工具,又是飞行器)
严格意思来说一个类只能继承一个父类,多余的父类只是在原父类基础上增加了一些功能
class Transportation:
print('交通工具')
class AircraftMixin:
print('交通工具之飞行器功能')
class Aircraft(AircraftMixin, Transportation):
print('飞机交通工具') # 该类同时继承两个类,我们认为父类是Transportation,飞机属于交通工具
# 而AircraftMixin类是飞行器有的功能,属于交通工具额外的功能
class Helicopter(AircraftMixin, Transportation):
print('直升飞机交通工具') # 该类同时继承两个类,我们认为父类是Transportation,飞机属于交通工具
# 而AircraftMixin类是飞行器有的功能,属于交通工具额外的功能
class Car(Transportation):
print('汽车交通工具') # 汽车就是交通工具
派生
子类会继承父类的属性和功能,这就是派生
在子类调用父类的属性1:指名道姓父类名.父类数据
属性查找:
在python2中没有显式地继承了object的子类,以该子类的子子类都称之为经典类
显式地继承了object的类,以及该类的子类,子子类都是新式类
而在python3中全部都是新式类
说到经典类和新式类就说到了python底层父类查找原理:c3算法
菱形继承问题
死亡钻石:一个子类继承的多个分支最终汇聚到一个非object类形成的一个菱形的继承圈;又称死亡钻石
在菱形继承问题下新式类和经典类的属性查找方式不同
新式类的查找方式:广度优先
经典类的查找方式:深度优先
区别在于广度最后查找object类;而深度顺着一条道直接找到object
Mixins机制
Mixins机制核心:就是在多继承的背景下尽可能的提升多继承代码的可读性
让多继承满足人的思维习惯===>什么'是'什么
简单来说就是在父类的类名后加上Mixin,那么这个父类名义上是子类的父类,其实只是为了给子类单纯的增加一些额外的功能,我们仍认为子类的父类只有一个
含Mixin后缀的父类写在左边,真正的父类写在最后边
网友评论