Python面向对象之继承代码详解


Posted in Python onJanuary 29, 2018

本文研究的主要是Python面向对象之继承的相关内容,具体如下。

Python 继承

即一个派生类(derived class)继承基类(bass class)字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计,一个Cat类型的对象派生自Animal类,这是模拟”是一个(is-a)”关系(例如,Cat是一个Animal)。

继承实现了代码的重用。

继承的基本语法:

class 派生类名(基类名1 [, 基类名2....]):

基类名写在括号里,基本类是在类定义的时候,在元组之中指明的。如果在继承元组中列了一个以上的类,那么它就被称作”多重继承” 。

多重继承

Python支持多重继承,也就是一个子类可以有多个父类,父类间用逗号隔开。

在多重继承中,子类有那么多的父类,那子类实例化时,构造方法是怎样调用的呢?

这里需要记住一点:

多重继承中,构造方法以第一个父类为中心。如果子类重新定义了构造方法,就不会调用父类的构造方法,构造就会只调用第一个父类的构造方法,并且如果父类中有同名的方法时,通过子类的实例对象去调用的该方法也是第一个父类中的方法。当然如果你需要在子类中用来某个或某几个父类的构造方法,需要显示的去调用父类的构造方法。

在python中继承中的一些特点:

  1. 在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
  2. 在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数。
  3. Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
  4. 子类只继承父类所有公有的属性和方法,并且也可以在子类中通过父类名来调用,而对于私有的属性和方法,子类是不进行继承的,因此在子类中是无法通过父类名来访问的。

实例:

class Parent(object): # define parent class 
 parentAttr = 100 
 def __init__(self): 
  print "Calling parent constructor" 

 def parentMethod(self): 
  print 'Calling parent method' 

 def setAttr(self, attr): 
  Parent.parentAttr = attr 

 def getAttr(self): 
  print "Parent attribute :", Parent.parentAttr

class Child1(Parent): # define child1 class 
 def __init__(self): 
  print "Calling child1 constructor" 

 def childMethod(self): 
  print 'Calling child1 method' 
  Parent.parentMethod(self) #调用基类的方法,所以要加上参数self

class Child2(Parent): # define child2 class 
 def childMethod(self): 
  print 'Calling child2 method' 
  self.parentMethod() #子类调用自己从父类那继承过来的父类的方法

c1 = Child1() # 实例化子类 1
c2 = Child2() # 实例化子类 2
c1.childMethod() # 调用子类的方法 
c2.childMethod() # 调用子类的方法 
c1.parentMethod() # 调用父类方法 
c1.setAttr(200) # 再次调用父类的方法 
c1.getAttr() # 再次调用父类的方法

执行结果:

Calling child1 constructor
Calling parent constructor
Calling child1 method
Calling parent method
Calling child2 method
Calling parent method
Calling parent method
Parent attribute : 200

解析:

c1 = Child1() # 实例化子类 1
c2 = Child2() # 实例化子类 2

这两句是创建Child1类和Child2类的实例对象,创建实例对象时,就会自动去调类的构造方法,如果子类中没有建立自己的构造方法,就会调用父类的构造方法,所以打印结果为:

Calling child1 constructor
Calling parent constructor

c1.childMethod() # 调用子类的方法
c2.childMethod() # 调用子类的方法

上面两句分别调用的是对应子类的子类方法,由于在子类中都分别有调用父类的方法,所以打印结果为:

Calling child1 method
Calling parent method
Calling child2 method
Calling parent method

注意:

子类继承父类以后,如果在子类在对父类的方法进行改造时,由需要用到父类的方法时,这个时候在子类中想要调用父类的方法时,该怎么做呢?有两种方法:

  1. Parent.parentMethod(self)
  2. self.parentMethod()

第一种是直接用父类的类名.方法名去调用父类的方法,但是需要注意的时,这种调用方法必须将self作为参数传进去并且作为第一个参数,表示指向指向这个类的实例本身。

第二种是直接用self去调用父类的方法,为什么可以这样调用呢?因为一旦子类继承了父类,那么子类就拥有父类所有的方法和属性,所以此时父类的方法和属性就相当于子类自己了,所以可以直接用self去直接调用实例的方法,而不用再传入self参数了。

使用issubclass()或者isinstance()方法来检测类之间的关系:

  1. issubclass() - 布尔函数判断一个类是另一个类的子类或者子孙类, 语法:issubclass(sub,sup)
  2. isinstance(obj, Class) 布尔函数如果obj是Class类的实例对象或者是一个Class子类的实例对象则返回true。

总结

以上就是本文关于Python面向对象之继承代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
ssh批量登录并执行命令的python实现代码
May 25 Python
对pandas中apply函数的用法详解
Apr 10 Python
python跳过第一行快速读取文件内容的实例
Jul 12 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
Mar 18 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
Aug 08 Python
django 配置阿里云OSS存储media文件的例子
Aug 20 Python
通过实例简单了解Python中yield的作用
Dec 11 Python
python实现修改固定模式的字符串内容操作示例
Dec 30 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
Feb 18 Python
pytorch数据预处理错误的解决
Feb 20 Python
PYQT5 vscode联合操作qtdesigner的方法
Mar 24 Python
python Scrapy框架原理解析
Jan 04 Python
Python多线程threading和multiprocessing模块实例解析
Jan 29 #Python
Python编程scoketServer实现多线程同步实例代码
Jan 29 #Python
Python模块搜索路径代码详解
Jan 29 #Python
python机器人行走步数问题的解决
Jan 29 #Python
python的socket编程入门
Jan 29 #Python
Python 错误和异常代码详解
Jan 29 #Python
python实现机器人行走效果
Jan 29 #Python
You might like
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
Laravel统一错误处理为JSON的方法介绍
2020/10/18 PHP
可输入的下拉框
2006/06/19 Javascript
Google韩国首页图标动画效果
2007/08/26 Javascript
几个javascript操作word的参考代码
2009/10/26 Javascript
javascript学习笔记(二) js一些基本概念
2012/06/18 Javascript
jQuery实现复选框全选/取消全选/反选及获得选择的值
2014/06/12 Javascript
JQuery动画与特效实例分析
2015/02/02 Javascript
javascript自定义滚动条实现代码
2020/04/20 Javascript
jQuery循环遍历子节点并获取值的方法
2016/04/14 Javascript
AngularJS基础 ng-model-options 指令简单示例
2016/08/02 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
jquery实现文字单行横移或翻转(上下、左右跳转)
2017/01/08 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
Node做中转服务器转发接口
2017/10/18 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
深入解析koa之异步回调处理
2019/06/17 Javascript
ES6扩展运算符和rest运算符用法实例分析
2020/05/23 Javascript
[01:22:10]Ti4 循环赛第二日 DK vs Empire
2014/07/11 DOTA
[02:32]【DOTA2亚洲邀请赛】iceice,梦开始的地方
2017/03/13 DOTA
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
用python对oracle进行简单性能测试
2020/12/05 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
HTML5 解析规则分析
2009/08/14 HTML / CSS
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
计生工作先进事迹
2014/08/15 职场文书
结婚司仪主持词
2015/06/29 职场文书
2016年优秀少先队员事迹材料
2016/02/26 职场文书
Python基础之函数嵌套知识总结
2021/05/23 Python
浅谈Java实现分布式事务的三种方案
2021/06/11 Java/Android
小程序实现侧滑删除功能
2022/06/25 Javascript
python如何将mat文件转为png
2022/07/15 Python