Python基础之面向对象:3、继承与派生

面向对象一、三大特征之继承

  • python三大特征:
    • 封装、继承、多态
  • 三者中继承最为核心,实际应用对,感受较为直观
  • 封装和多态略微抽象

Python基础之面向对象:3、继承与派生

文章插图
1、继承的概念继承的含义:
? 在现实生活中 , 继承表示人与人之间资源的从属关系
?例如:儿子继承父亲
? 在编程的世界中,继承表示类与类之间的资源从属关系
?例如:类a继承类b
继承的目的:
? 在现实生活中,儿子继承了附件就拥有了父亲所有资源的支配权限
? 在编程世界中,类A继承了类B就拥有了类B中所有的数据和方法使用权限
2、继承的本质? 继承本质应该分为两部分:
?当多个类中含有相同部分时 , 我们就把相同的部分抽离出去 , 将相同的部分新成一个新的类,在用刚才被抽离出去相同部分的类,去继承新的那部分,这样的好处就是,当多个类需要一个相同用的功能时 , 可以节省代码,不用反复编写
?抽象:将多个类相同的东西抽出去 , 形成一个新的类
?继承:将多个类继承刚刚抽取出来的新的类
对象>>>:数据与功能的结合体
类(子类)>>>:多个对象相同功能和数据的结合体
父类>>>:多个子类相同功能和数据的结合体
本质:类、父类的本质都是为了节省代码,减少重复编写相同代码的时间,使用时更为方便

Python基础之面向对象:3、继承与派生

文章插图
3、继承的实操
  • 在定义类的时候,类名后方可加括号 , 早括号内填入其他它类的名字,就意味着继承了其它类
  • python支持多类继承,括号内可填写多个类名,只需用逗号隔开即可
# 1、定义两个类,其中一个假设为父类,另一个假设为子类class Father:money = 99999999house = '老北京四合院'# 父类中数据强大class Son:pass# 子类中空空如也# 2、父类中的数据,之类无权直接使用,当我们在子类中继承父类后 , 子类和子类产生的对象都可以通过'点'的方式使用父类中的数据class Father:money = 99999999house = '老北京四合院'class Son(Father):pass# 子类直接使用父类中的数据print(Son.money)# 子类产生的对象使用父类中的数据obj1 = Son()print(obj1.money)------------------------------------------------------------------------------------99999999999999994、继承后名字查找的顺序未继承:
? 对象(object)自身名称空间>>>类的名称空间
单线继承:
? 对象(object)自身名称空间>>>子类的名称空间>>>父类的名称空间
多线继承:
? 1、菱形继承:(广度优先,最后才会找闭环的定点)
?对象自身名称空间>>>子类名称空间>>>父类名称空间(形参内由左至右)>>>闭环
? 2、非菱形继承: (深度优先)
?对象自身名称空间>>>子类名称空间>>>父类名称空间(形参内由左至右)
在一个子类绑定多个父类时,名字的查找顺序可能比较难理解,针对这个问题,可以使用python中内置方法:mor() 通过对象名点mor() 的方式 , 可以帮助我们查看名字的查找顺序
Python基础之面向对象:3、继承与派生

文章插图
5、经典类与新式类经典类:
? 不继承object的类或者其子类的类
新式类:
? 继承object或者其之类的类
? 在python3中,只有新式类 , 所有类都默认继承object
? 在python2中 , 区分经典类和新式类
在以后我们定义类的时候 , 如果没有明确的父类,可以在类的括号内填入object,这样话能够提高我们代码的兼容性
二、派生1、派生的概念? 派生是指,子类继承父类,派生出自己的属性与方法,并且重用父类的属性与方法
2、派生的方法1.直接引用父类的__ init __为其传参 , 并添加子类属性
?缺点:代码重复率太高,浪费资源 , 时间
class People:school = '清华大学'def __init__(self, name, sex, age):self.name = nameself.sex = sexself.age = ageclass Teacher(People):def __init__(self, name, sex, age, title): #派生self.name = nameself.sex = sexself.age = ageself.title = titledef teach(self):print(f'{self.name}是老师')obj = Teacher('lili','female', 28, '高级教师')#只会找自己类中的__init__print(obj.name, obj.sex, obj.age, obj.title)#lili female 28 高级教师

推荐阅读