翼度科技»论坛 编程开发 python 查看内容

Python基础面向对象之继承与派生详解

4

主题

4

帖子

12

积分

新手上路

Rank: 1

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

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


1、继承的概念

继承的含义:
在现实生活中,继承表示人与人之间资源的从属关系
例如:儿子继承父亲
在编程的世界中,继承表示类与类之间的资源从属关系
例如:类a继承类b
继承的目的:
在现实生活中,儿子继承了附件就拥有了父亲所有资源的支配权限
在编程世界中,类A继承了类B就拥有了类B中所有的数据和方法使用权限

2、继承的本质

继承本质应该分为两部分:
当多个类中含有相同部分时,我们就把相同的部分抽离出去,将相同的部分新成一个新的类,在用刚才被抽离出去相同部分的类,去继承新的那部分,这样的好处就是,当多个类需要一个相同用的功能时,可以节省代码,不用反复编写
抽象:将多个类相同的东西抽出去,形成一个新的类
继承:将多个类继承刚刚抽取出来的新的类
  1. 对象>>>:数据与功能的结合体
  2. 类(子类)>>>:多个对象相同功能和数据的结合体
  3. 父类>>>:多个子类相同功能和数据的结合体
  4. 本质:类、父类的本质都是为了节省代码,减少重复编写相同代码的时间,使用时更为方便
复制代码


3、继承的实操

在定义类的时候,类名后方可加括号,早括号内填入其他它类的名字,就意味着继承了其它类
python支持多类继承,括号内可填写多个类名,只需用逗号隔开即可
  1. # 1、定义两个类,其中一个假设为父类,另一个假设为子类
  2. class Father:
  3.     money = 99999999
  4.     house = '老北京四合院'  # 父类中数据强大
  5. class Son:
  6.     pass  # 子类中空空如也
  7. # 2、父类中的数据,子类无权直接使用,当我们在子类中继承父类后,子类和子类产生的对象都可以通过'点'的方式使用父类中的数据
  8. class Father:
  9.     money = 99999999
  10.     house = '老北京四合院'
  11. class Son(Father):
  12.     pass
  13. # 子类直接使用父类中的数据
  14. print(Son.money)
  15. # 子类产生的对象使用父类中的数据
  16. obj1 = Son()
  17. print(obj1.money)
  18. ------------------------------------------------------------------------------------
  19. 99999999
  20. 99999999
复制代码
4、继承后名字查找的顺序

未继承:
对象(object)自身名称空间>>>类的名称空间
单线继承:
对象(object)自身名称空间>>>子类的名称空间>>>父类的名称空间
多线继承:
1、菱形继承: (广度优先,最后才会找闭环的定点)
对象自身名称空间>>>子类名称空间>>>父类名称空间(形参内由左至右)>>>闭环
2、非菱形继承: (深度优先)
对象自身名称空间>>>子类名称空间>>>父类名称空间(形参内由左至右)
在一个子类绑定多个父类时,名字的查找顺序可能比较难理解,针对这个问题,可以使用python中内置方法:mor()   
通过对象名点mor() 的方式,可以帮助我们查看名字的查找顺序


5、经典类与新式类

经典类:
不继承object的类或者其子类的类
新式类:
继承object或者其之类的类
在python3中,只有新式类,所有类都默认继承object
在python2中,区分经典类和新式类
在以后我们定义类的时候,如果没有明确的父类,可以在类的括号内填入object,这样话能够提高我们代码的兼容性

二、派生


1、派生的概念

派生是指,子类继承父类,派生出自己的属性与方法,并且重用父类的属性与方法

2、派生的方法

1.直接引用父类的__ init __为其传参,并添加子类属性
缺点:代码重复率太高,浪费资源,时间
  1. class People:
  2.     school = '清华大学'
  3.     def __init__(self, name, sex, age):
  4.         self.name = name
  5.         self.sex = sex
  6.         self.age = age
  7. class Teacher(People):
  8.     def __init__(self, name, sex, age, title): #派生
  9.         self.name = name
  10.         self.sex = sex
  11.         self.age = age
  12.         self.title = title
  13.     def teach(self):
  14.         print(f'{self.name}是老师')
  15. obj = Teacher('lili','female', 28, '高级教师')
  16. #只会找自己类中的__init__
  17. print(obj.name, obj.sex, obj.age, obj.title)  
  18. #lili female 28 高级教师
复制代码
2.通过super()来只想父类的属性
super()是一个特殊的类,在子类__ init __内调用super得到一个对象,该对象指向父类的名称空间
  1. class Teacher(People):
  2.     def __init__(self, name, sex, age, title):
  3.         super().__init__(name, age, sex)
  4.         #调用的是绑定方法,自动传入self
  5.         self.title = title
  6.          def teach(self):
  7.          print(f'{self.name}是老师')
  8. obj = Teacher('lili','female', 28, '高级教师')
复制代码
  1. 注意:在python2中super 的使用需要完整地写成super(自己的类名,self),而在python3中可以简写为super()。
复制代码
以上就是Python基础面向对象之继承与派生详解的详细内容,更多关于Python面向对象继承派生的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/article/266708.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具