概念:子类继承父类的属性和方法。
一个派生类(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之面向对象继承和派生
Python之面向对象继承和派生 什么是继承: 继承是一种创建新的类的方法.在Python中,新建的类可以继承自一个或多个父类.原始类称为基类或超类. 新建的类称为派生类或子类. Python中类的继 ...
- python小兵 面向对象继承super和c3算法
python多继承 在前面的学习过程中. 我们已经知道了Python中类与类之间可以有继承关系. 当出现了x是一种y的的时候. 就可以使⽤继承关系. 即"is-a" 关系. 在继承 ...
- Python之面向对象继承复习
总结:self是谁就从谁开始寻找
- python中多继承C3算法研究
在python的面向对象继承问题中,单继承简单易懂,全部接受传承类的属性,并可添加自带属性, 但是,在多继承情况下,会遇到多个被继承者的顺序问题,以及多次继承后查找前几次继承者需求属性时,可能不易发现 ...
- python之面向对象(继承)
类的继承 python之面向对象(继承) 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制.继承完全可以理解成类之间的类型和子类型关系. 需要注意的地方:继承语法 c ...
- Python之路-面向对象&继承和多态&类属性和实例属性&类方法和静态方法
一.面向对象 编程方式 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强…” 什么是面 ...
- python学习日记(面向对象——继承)
什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 python中类的继承分为:单继承和多继承 class Par ...
- Python学习(七)面向对象 ——继承和多态
Python 类的继承和多态 Python 类的继承 在OOP(Object Oriented Programming)程序设计中,当我们定义一个class的时候,可以从某个现有的class 继承,新 ...
- 《Python》 面向对象三大特性之继承
一.继承大纲: 继承和抽象(两个概念) 1.单继承: 语法: 父类.基类.超类 子类.派生类 继承与重用:子类可以使用父类中的名字(变量和方法) 继承与派生:子类在父类的基础上又新创建了自己需要的方法 ...
- 【学习笔记】--- 老男孩学Python,day18 面向对象------继承
继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类, 父类又可称为基类或超类,新建的类称为派生类或子类 python中类的继承分为:单继承和多继承 class Fathe ...
随机推荐
- 复选框(checkbox)、多选框
1.需求分析 可同时选中多个选项,实现全选.全不选.反选等功能. 2.技术分析 基础的HTML.CSS.JavaScript. 3.详细分析 3.1 HTML部分 图示是一个列表加底部一段文字说明,列 ...
- shell脚本,awk结合正则来打印文件里面的内容。
文件内容如下:key1abc d key2 1.想得到如下结果: abc d 2.想得到如下结果: key1key2
- quartz调度
http://www.cnblogs.com/lzrabbit/archive/2012/04/14/2446942.html
- NSCopying
///< .h @interface ChatManager : NSObject <NSCopying> @property (nonatomic) NSUInteger inde ...
- 螺旋矩阵,两步进阶,从暴力到o(1)
题目描述 一个 n 行 n 列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵中所有格 ...
- 洛谷P1111修复公路并查集改
看了他们的题解感觉很震惊,为什么要用kruskal,这题要用到最小生成树吗??? 38行短短的程序就可以了,我觉得学习不是一种套用,套自己学的,而且题解很大一部分都是kruskal. 个人认为自己的程 ...
- linux下安装redis和使用
http://www.linuxidc.com/Linux/2014-05/101979.htm
- MySql学习笔记04
复习 day01 数据库相关: create database db4 character set utf8; show databases; show create database db4; dr ...
- 短信验证码js
var isSmsSend = false; function clickButtona(obj){ var obj = $(obj); var mobile=$("input[name=m ...
- Python 格式化
数字前面补0 字符型: print('23'.zfill(5)) 数字型: print('%011d' % 124) 日期与str互转: datetime 转 str str_date = datet ...