概念:子类继承父类的属性和方法。
一个派生类(derived class)继承基类(bass class)字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
一、单继承 :推崇。特点和使用
eg:
class Parent(object):
parentAttr = 100
def __init__(self):
print 'Calling parent constructor'
self.name='dengxiaoping'
def parentMethod(self):
print 'Calling parent method'
def setAttr(self, attr):
Parent.parentAttr = attr
def getAttr(self):
print 'Parrent attribute:',Parent.parentAttr
 
class Child1(Parent):
def __init__(self):
print 'Calling child1 constructor'
def childMethod(self):
print 'Calling child1 method'
Parent.parentMethod(self)
class Child2(Parent):
def childMethod(self):
print 'Calling child2 method'
self.parentMethod()
 
1、父类构造方法的继承
c1=Child1()
这一句是创建实例对象时,就会自动去调类的构造方法__init__进行初始化工作,如果子类中没有实现构造方法__init__,就会直接调用父类的构造方法
c1=Child1() #Calling child1 constructor
Child1() 创建实例对象:子类中有自己的构造函数,所以父类的构造函数不在起作用
print c1.name 报错
print c1.parentAttr #100 类属性直接继承过来
c2=Child2() #Calling parent constructor
Child2() 子类中没有构造方法,完全继承父类的构造方法,
print c2.name #dengxiaoping
总结:构造方法需要在其派生类的构造方法中专门调用,即子类不会主动继承基类的构造方法。
2、在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
子类调用父类的方法有两种方式:
1、Parent.parentMethod(self)
2、self.parentMethod()
第一种是直接用父类的类名.方法名去调用父类的方法,但是需要注意的是,这种调用方法必须将self作为参数传进去并且作为第一个参数,表示指向这个类的实例本身。这种方法多用于方法重写时。
第二种是直接用self去调用父类的方法,为什么可以这样调用呢?因为一旦子类继承了父类,那么子类就拥有父类所有的公有方法和属性,所以此时父类的方法和属性就相当于子类自己了,所以可以直接用self去直接调用实例的方法,而不用再传入self参数了。
class Child1(Parent):
def __init__(self):
print 'Calling child1 constructor'
def childMethod(self):
print 'Calling child1 method'
Parent.parentMethod(self) #调用基类的方法,所以要加上参数self
这里:Parent.parentMethod(self)可以使用self.parentMethod()替换,
class Child2(Parent):
def childMethod(self):
print 'Calling child2 method'
self.parentMethod() #子类调用自己从父类那继承过来的父类的方法
 
 
3、在子类中引用父类的构造方法:
(1)superclassname.__init__(self,params) 尽量使用第一种
(2)super(subclassname,self).__init__(params) 这一种不支持多继承
class Child1(Parent):
def __init__(self):
Parent.__init__(self)
print 'Calling child1 constructor'
第二种:
class C(A):
def __init__(self):
super(C, self).__init__() #调用基类构造方法
 
4、通过构造方法,把变量从子类传到父类
如果基类构造方法需要传入参数时,创建子类的实例对象时,就必须传入对应的参数,否则会报参数数量不匹配的错。
class Parent(object):
parentAttr = 100
def __init__(self,name,age):
print 'Calling parent constructor'
self.name = name
self.age = age
 
class Child1(Parent):
def __init__(self,name,age):
Parent.__init__(self,name,age)
print 'Calling child1 constructor'
 
5、通过实例方法,把变量从子类传到父类
def parentMethod(self,name):
print 'Calling parent method'
print 'your old name is %s'%self.name
print 'your new name is %s'%name
 
def childMethod(self,name):
print 'Calling child1 method'
Parent.parentMethod(self,name)
 
6、Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找需要调用的方法,找不到才去基类中找)
新式类按照广度优先去查找,继承object的是新式类
经典类按照深度优先的方式去查找
 
7、子类只继承父类所有公有的属性和方法,并且也可以在子类中通过父类名来调用,而对于私有的属性和方法,子类是不进行继承的,因此在子类中是无法通过父类名来访问的。
 
8、继承的本质
对于面向对象的继承来说,其实就是将多个类共有的方法提取到父类中,子类仅需继承父类而不必一一实现每个方法。
注:除了子类和父类的称谓,你可能看到过 派生类 和 基类 ,他们与子类和父类只是叫法不同而已。
 
二、类间的关系判断
isinstance() 判断是否是实例
issubclass() 判断是否是子类
isinstance(c1,Child1)
issubclass(Child1,Parent)
issubclass(Child1,object)
 
三、多重继承:不建议使用多继承
一个子类继承多个父类
调用父类构造函数:superclassName.__init__(self, [parameter1[,parameter2....]] )
调用父类中的函数:Parent.parentMethod(self)
class D(object):
def bar(self):
print 'D.bar'
 
class C(D):
def __init__(self):
print 'B init'
def bar(self):
print 'C.bar'
 
class B(D):
def __init__(self):
print 'B init'
def bar(self):
print 'B.bar'
 
class A(B,C): 多重继承
def bar(self):
print 'A.bar'
a1=A() # B init 多重继承时,默认继承的第一个父类的构造方法
 
class A(B,C):
def __init__(self):
B.__init__(self)
C.__init__(self)
D.__init__(self)
def bar(self):
print 'A.bar'

Python之面向对象:继承的更多相关文章

  1. Python之面向对象继承和派生

    Python之面向对象继承和派生 什么是继承: 继承是一种创建新的类的方法.在Python中,新建的类可以继承自一个或多个父类.原始类称为基类或超类. 新建的类称为派生类或子类. Python中类的继 ...

  2. python小兵 面向对象继承super和c3算法

    python多继承 在前面的学习过程中. 我们已经知道了Python中类与类之间可以有继承关系. 当出现了x是一种y的的时候. 就可以使⽤继承关系. 即"is-a" 关系. 在继承 ...

  3. Python之面向对象继承复习

    总结:self是谁就从谁开始寻找

  4. python中多继承C3算法研究

    在python的面向对象继承问题中,单继承简单易懂,全部接受传承类的属性,并可添加自带属性, 但是,在多继承情况下,会遇到多个被继承者的顺序问题,以及多次继承后查找前几次继承者需求属性时,可能不易发现 ...

  5. python之面向对象(继承)

    类的继承 python之面向对象(继承) 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制.继承完全可以理解成类之间的类型和子类型关系. 需要注意的地方:继承语法 c ...

  6. Python之路-面向对象&继承和多态&类属性和实例属性&类方法和静态方法

    一.面向对象 编程方式 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强…” 什么是面 ...

  7. python学习日记(面向对象——继承)

    什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 python中类的继承分为:单继承和多继承 class Par ...

  8. Python学习(七)面向对象 ——继承和多态

    Python 类的继承和多态 Python 类的继承 在OOP(Object Oriented Programming)程序设计中,当我们定义一个class的时候,可以从某个现有的class 继承,新 ...

  9. 《Python》 面向对象三大特性之继承

    一.继承大纲: 继承和抽象(两个概念) 1.单继承: 语法: 父类.基类.超类 子类.派生类 继承与重用:子类可以使用父类中的名字(变量和方法) 继承与派生:子类在父类的基础上又新创建了自己需要的方法 ...

  10. 【学习笔记】--- 老男孩学Python,day18 面向对象------继承

    继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类, 父类又可称为基类或超类,新建的类称为派生类或子类 python中类的继承分为:单继承和多继承 class Fathe ...

随机推荐

  1. Bootstrap历练实例:警告框(Alert)插件事件

    事件 下表列出了警告框(Alert)插件中要用到的事件.这些事件可在函数中当钩子使用. 事件 描述 实例 close.bs.alert 当调用 close 实例方法时立即触发该事件. $('#myal ...

  2. react 信用卡格式检验

    前言: 技术栈主要基于react + ant-design 描述: 填写信用卡卡号时,会自动四位空格,并格式校验判断卡种  ,这里我们业务只涉及到四种卡. 代码解析 // ant 组件自引,这里我只讲 ...

  3. css3媒体查询中device-width和width的区别

    1.device-width 定义:定义输出设备的屏幕可见宽度. 不管你的网页是在safari打开还是嵌在某个webview中,device-width都只跟你的设备有关,如果是同一个设备,那么他的值 ...

  4. 区块链工作 jd

    https://www.lagou.com/jobs/4096098.html 技术咨询网站: https://mp.weixin.qq.com/s/hs37UZFGI3uR4qmQ7v346g## ...

  5. linux正则表达式企业级深度实践案例2

    [root@redhat~]#  sed  -nr  ' s#([ ^ : ]+)  (: .* :)  (/.*$)#\3\2\1#gp '  /etc/passwd

  6. 如何使用koa实现socket.io官网的例子

    socket.io官网中使用express实现了一个最简单的IM即时聊天,今天我们使用koa来实现一下 ### 框架准备 确保你本地已经安装好了nodejs和npm,使用koa要求node版本> ...

  7. JavaScript ES6功能概述(ECMAScript 6和ES2015 +)

    JavaScript在过去几年中发生了很大的变化.这些是您今天可以开始使用的12项新功能! 该语言的新增内容称为ECMAScript 6.它也称为ES6或ES2015 +. 自1995年JavaScr ...

  8. JZOJ 1264. 乱头发节

    1264. 乱头发节(badhair.pas/c/cpp) (File IO): input:badhair.in output:badhair.out Time Limits: 1000 ms  M ...

  9. 第11课 文章分类(组件化开发) Thinkphp5商城第四季

    目录 思路: 控制器里 扩展类里: 视图层: 思路: 控制器查出所有数据后调用扩展类里的无限级分类 public function catetree($cateRes) 方法. 把排序好的数据传给视图 ...

  10. LightOJ - 1341 Aladdin and the Flying Carpet(数论)

    题意 有一块矩形(也可能是正方形)的飞毯. 给定飞毯的面积\(n\)和最小可能的边长\(a\),求可能有多少种不同边长的飞毯.(\(1<=a<=n<=1e12\)) 如面积\(n=6 ...