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 相关文章推荐
python 测试实现方法
Dec 24 Python
用python登录Dr.com思路以及代码分享
Jun 25 Python
简单谈谈Python中的反转字符串问题
Oct 24 Python
python中实现将多个print输出合成一个数组
Apr 19 Python
Django实现全文检索的方法(支持中文)
May 14 Python
python 获取当天凌晨零点的时间戳方法
May 22 Python
Python简单I/O操作示例
Mar 18 Python
Django单元测试工具test client使用详解
Aug 02 Python
Python学习笔记之For循环用法详解
Aug 14 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
May 11 Python
Django rest framework分页接口实现原理解析
Aug 21 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容易忘记的知识点分享
2013/04/30 PHP
基于php实现长连接的方法与注意事项的问题
2013/05/10 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
async和DOM Script文件加载比较
2014/07/20 PHP
php+xml编程之SimpleXML的应用实例
2015/01/24 PHP
List Installed Software Features
2007/06/11 Javascript
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
2015/01/09 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
2015/02/27 Javascript
javascript弹性运动效果简单实现方法
2016/01/08 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
2017/04/28 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
cordova+vue+webapp使用html5获取地理位置的方法
2019/07/06 Javascript
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
微信小程序实现电子签名功能
2020/07/29 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
python开发中module模块用法实例分析
2015/11/12 Python
在Windows中设置Python环境变量的实例讲解
2018/04/28 Python
python 已知三条边求三角形的角度案例
2020/04/12 Python
css3 中的新特性加强记忆详解
2016/04/16 HTML / CSS
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
HTML5为输入框添加语音输入功能的实现方法
2017/02/06 HTML / CSS
韩国11街:11STREET
2018/03/27 全球购物
户外婚礼策划方案
2014/02/08 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
税务干部个人整改措施思想汇报
2014/10/10 职场文书
2015年药房工作总结
2015/04/25 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS