2021年2月教育行业融资报告:2家企业共融资35.18亿元,粉笔教育完成首次公开融资

导语

2021年2月份,教育行业共发生22起融资事件,融资总金额约为35.18亿元,其中最大的一笔融资为粉笔教育获得的3.9亿美元A轮融资。据悉,此次融资也是粉笔教育自成立以来首次公开融资,由IDG和挚信资本领投,华兴资本旗下华兴新经济基金等机构跟投。值得一提的是,领投的挚信资本已经连续两个月参与超亿美元规模的融资。在此前的1月,其同样领投了火花思维超1.5亿美元的E+轮融资。

(注:按照惯例未披露融资额的事件未统计金额。为了方便统计,我们对金额按照取中间数值的规则来计算——数百万融资取300万来计算;数千万融资取3000万来计算;另外,保守起见,近千万融资我们取600万来计算,近千万美元则取600万美元即3600万人民币来计算;千万级指1000万;近亿元指6000万;上亿元指的是1亿元。附:融资时间以媒体披露时间计算)

 

2月教育行业融资报告:22家企业共融资35.18亿元,粉笔教育完成首次公开融资

融资轮次

2月教育行业融资报告:22家企业共融资35.18亿元,粉笔教育完成首次公开融资

统计数据显示,2月融资轮次中,战略融资以8起数量的绝对优势,位居轮次发生频率榜首,占比约为36.36%;A轮和Pre-A轮融资并列第二,两者均有3起事件发生;天使轮融资则发生2起,以9.09%的占比位列第四。此外,Pre-B轮、B轮、C轮、D1轮、D+轮以及股权融资这六个轮次,在2月份也均有1起融资发生。

2月融资轮次中,早期融资占比有小幅上升,相比于1月的50.72%,2月的早期融资占比上升了约9个百分点,来到了59.09%。

 

2月教育行业融资报告:22家企业共融资35.18亿元,粉笔教育完成首次公开融资

地域分布

2月教育行业融资报告:22家企业共融资35.18亿元,粉笔教育完成首次公开融资

从地域分布看,北京地区依旧是资本“高地”,22起融资事件中共有9起来自北京,占比超过40%。广东、上海、浙江等东南沿海发达地区融资数量虽不及北京,但也有多起融资发生。其中,广东3起,上海、浙江各有两起。此外,与1月相比,2月融资地域分布范围也有所扩大,从1月的7个地区扩展为10个地区。除上述四个地区外,福建、河北、湖南、江苏、陕西、四川也有融资发生。

 

2月教育行业融资报告:22家企业共融资35.18亿元,粉笔教育完成首次公开融资

融资体量

2月教育行业融资报告:22家企业共融资35.18亿元,粉笔教育完成首次公开融资

融资体量上看,2月融资总金额相较于1月有小幅上涨,从上月的30.23亿增长到本月的35.18亿,涨幅约为16.37%。值得一提的是,融资金额上涨的同时,融资事件数量却较1月有所减少,总数比1月少了6起(1月共发生28起融资事件)。2月的融资体量中,各个层级融资的数量基本持平,数百万和上亿元体量的事件各有5起,数千万体量的发生6起。此外,还有6起融资事件未披露具体金额。

在5起上亿元的融资事件中,粉笔教育以3.9亿美元拔得头筹,这也是本月唯一一起数额超十亿人民币的融资事件。榜眼则由美术教育服务平台美术宝以4000万美元摘得;K12领域的杰睿教育以2.1亿元人民币夺得探花。

 

2月教育行业融资报告:22家企业共融资35.18亿元,粉笔教育完成首次公开融资

细分领域

2月教育行业融资报告:22家企业共融资35.18亿元,粉笔教育完成首次公开融资

2月融资事件细分领域中,企业服务以7起的数量占据榜首;职业教育以6起屈居第二;素质教育领域共发生4起,位列第三。此外,早幼教、K12、语言培训、高等教育等领域均有1起及以上数量的融资事件数量发生。

与1月相比,2月的融资细分领域也有所扩展,在1月的基础上又新添K12、高等教育两条赛道。其中,职业教育领域融资金额最高,共有26.41亿元,约占2月融资总金额的75%。该细分赛道内数额最大的一笔融资即粉笔教育所获的3.9亿美元A轮融资。素质教育以3.08亿元位居第二,占比约为8.75%。K12以2.1亿元位列细分领域融资总额第三名。此外,语言培训、企业服务领域融资总量也均超过亿元。其中,语言培训领域中的东方启音融资2300万美元,约合1.48亿元人民币;企业服务领域中的EC六度人和也有1亿元人民币融资。

 

2月教育行业融资报告:22家企业共融资35.18亿元,粉笔教育完成首次公开融资

附总表

2月教育行业融资报告:22家企业共融资35.18亿元,粉笔教育完成首次公开融资

 

 

 

 

 

结语

总体来看,教育行业正在稳中求进的走过2021年第一季度,融资规模虽还未能达到去年后半段的水平,但与2020年同期相比趋势已经明显向好,要知道2020年1~2月两个月份的融资总额(34亿)才勉强与本月基本持平。相信随着3月全国各地学校及教培机构的正式开学复课,教育行业将会迎来一个温暖的“春天”。

 

2月教育行业融资报告:22家企业共融资35.18亿元,粉笔教育完成首次公开融资

转自:https://mp.weixin.qq.com/s/3jDFc3DUSBVUA5rIzsJd1g

大盘跌倒,“电茅”新高

大盘跌倒,“电茅”新高

大盘跌倒,“电茅”新高

     水电站不会受原料价格波动的影响,所以利润率很高,拥有稳定且充沛的现金流,是少数几个能做到“现金流水即利润”的行业。

文 | 光头君Schelling

来源 | 贝瑞研究A股

本文聚焦:

1.能源竞争格局与水电业务特点

2.世界水电王者的竞争优势

3.现金奶牛有多“奶”

4.以投资扩充电力业务战略版图

3月9日A股又是暴跌的一天,很多人心态已经快崩了。但是,要说年后哪些股民心态最平稳,我相信长江电力(600900.SH)的股东算一个。

大盘跌倒,“电茅”新高

因为现在不少同学开始关注高股息的投资策略与上市公司,我在《买理财不如持有5%股息的股票,这个策略也有雷!》的文中,就详细介绍了A股中高股息公司的四种类型,其中就提高到了长江电力,这一篇文章我们就来聊一下长江电力的基本面情况。

长江电力成立于2002年,控股股东三峡集团持有62.27%的股份,股权结构稳定。公司通过逐步收购母公司成熟的水电资产,目前拥有长江干流上的三峡、葛洲坝、溪洛渡、向家坝 4 座巨型水电站,是为A股最大的电力上市公司,乃至全球最大的水电上市公司。

01 能源竞争格局与水电业务特点

我国是全球水电资源最丰富的国家,无论是发电量,还是装机容量都是全球水电第一大国。水电在国内也是仅次于火电的第二大能源形式,占比两成左右。

2019年中国各类能源装机/发电量与占比:

大盘跌倒,“电茅”新高

数据来源:中电联

水电是技术最成熟、最早进行大规模商业开发的可再生能源,与火电、核电、风电、光伏发电等相比,水电具有如下特点:

1、多电站协作具有内生性增长

“火核风光”电的能源载体只能在单一电站使用,无法进行人工调节。水电的能源载体(水流)可以在流经的每个电站重复利用,如果在同一水系拥有多处电站,通过调节各大坝的水头与入库流量,可实现电站群的优化运行。

我国降雨主要集中在 6-9 月,丰水期来水量将近枯水期的2倍,水电站的收入主要体现在下半年。通过阶梯式水量调配,提高水能利用率和综合效益最大化,是拥有同流域多电站群的水电公司重要的内生性增长来源。

大盘跌倒,“电茅”新高

数据来源:公司公告

2、一次投资,长期收钱

水电站的投资大、建设周期长,还涉及到移民等等事项,比如三峡电站,总投资2000亿,工期17年,这期间只有少许回报。

但在机组投产后,成本主要是就是大坝、厂房等固定资产的折旧费用和财政规费,原材料、废料处理等成本基本没有,不会受原料价格波动的影响,所以水电站的利润率很高,拥有稳定且充沛的现金流,是少数几个能做到“现金流水即利润”的行业。

电力龙头公司毛利率情况:

大盘跌倒,“电茅”新高

数据来源:公司财报

3、利润创造能力没有充分反映

大坝、厂房等固定资产是以直线法按照45年来计提折旧的,但大坝的实际使用年限约100年,比如美国胡佛大坝从1936年交付,到现在85年了仍在使用。资产折旧与使用年限错配,隐藏了未来的真实利润。

大盘跌倒,“电茅”新高

4、护城河无法复制

水电站最大的无形资产就在于选址,风电和太阳能对选址也有一些要求,但是差别没有水电那么大。别说2000亿,就算投个2万亿,也无法在中国再造一个三峡电站,这种不可替代性就是企业最大的护城河。

我国水电资源理论年发电量6.08万亿千瓦时,技术可开发年电量2.47万亿千瓦时。理论装机容量6.94亿千瓦,技术可开发装机5.42亿千瓦。

截至2019年底,我国水电装机容量3.56亿千瓦,占技术可开发量的65.7%,如果算上正在开发与待装机的水电站,开发程度已经很高。例如,目前在建电站中,除白鹤滩和乌东德电站之外,装机500万千万以上水电站增量近乎为零,优质大水电具有较强的稀缺性。

我国十三大水电基地与相关上市公司:

大盘跌倒,“电茅”新高

资料来源:国家发改委

 02 核心业务板块:水电业王者

长江电力目前拥有三峡(世界最大)、溪洛渡(世界第4)、向家坝(世界第11)、葛洲坝四座大型水电站。

大盘跌倒,“电茅”新高

截至2019年底,拥有82台水电机组,装机容量4549.5万千瓦,

占全国水电装机的12%,公司发电量2104.63亿千瓦时,超出设计发电量9.8%,占全国水电发电总量的16.3%。

其中,单机容量70万千瓦及以上级巨型机组58台,占世界投产单机70万千瓦及以上水电机组总数的1/2。

大盘跌倒,“电茅”新高

数据来源:公司公告

目前,三峡集团在建白鹤滩(世界第2,2020年投产发电)、乌东德水(世界第7,2021年投产发电),预计待两个大坝资产成熟运营后,由长江电力收购注入上市公司体内。

届时,长江电力将拥有世界12大水电站中的5座,运营管理的70万千瓦及以上水轮发电机组将占世界总数的2/3,在国内运营的水电装机容量占比超过20%。

大盘跌倒,“电茅”新高

与其他同类上市公司采用的自主投资、建设、运营发电的方式不同,长江电力采用大坝由三峡集团出资建设,长江电力代管运营,资产成熟后收购的方式。这就导致公司的资产、利润、现金流是以阶梯式的形态成长的,如果看利润年复合增长率,可达17%。

大盘跌倒,“电茅”新高

图片来源:公司公告

这种方式的优缺点也很明显。缺点是收购时会产生较高的溢价。优点是有效隔离了建设开发中的一系列风险,规避了长达数年的只有投入而没有回报的情况,否则长江电力的财报也不会如此好看。

毕竟建设期的资金也有时间成本、贷款也要付利息,我认为即便是高溢价收购,对公司与股东来说也是最稳健的选择。

  • 拥有电站资产群的优势

处于同一流域上下游的电站群,通过梯级水库联合调度,调配季度间水流蓄能,减少各梯级水库的弃水,使汛期发电量平滑至枯水期,以提升发电量。

联合调度减少电站弃水

大盘跌倒,“电茅”新高

数据来源:公司公告

通过“四库联调”(溪洛渡-向家坝-三峡-葛洲坝),综合丰枯比(发电量Q3 /Q1)从2012年的3.2下降到2019年2.1,四电站年发电量均超过设计值,合计近200亿千瓦时,相当于每年提升40亿的营收。待“乌、白”电站投产后升级为“六库联调”,预计超发电量再增加100亿千瓦时。

大盘跌倒,“电茅”新高

数据来源:公司公告

如下图所示,公司拥有电站的上游和支流还存在30余座水电站。如果想通过技术运营手段,实现发电量与业绩最大化,就需要将上游电站也纳入联合调度序列。

长江流域水电站分布图:

大盘跌倒,“电茅”新高

图片来源:公司公告

具体的方法就是通过股权投资或进入董事会的方式,增加公司在各电站中的话语权,“一统”长江流域联合调度的江湖,并实现利益共享。目前主要目标是雅砻江、金沙江中游、贵州内流域的水电站。

对长江上游(雅砻江)的水电站整合:对国投电力(控股雅砻江水电52%)、川投能源(参股雅砻江水电48%)持股比例均超过10%,皆为第二大股东,并在国投电力拥有1席董事会席位。

对长江中游(金沙江)的水电整合:取得金中公司23%股权,成为其第二大股东。

远期来看,若长江上游也实现联合调度,预计每年可整体增发电量约400亿千瓦时。

长江上游水电站持股情况:

大盘跌倒,“电茅”新高

数据来源:公司年报、公告

 03 产业链拓展:配售电业务

水电站虽然是不可多得现金牛资产,但是也有明显的天花板,长江流域上的可开发电站就那么多,而且白鹤滩电站开发完成后,三峡集团在手大型水电站将全部开发完毕。针对持续成长性不足的问题,就需要在主业的基础上拓展新的业务。

公司依托发电侧的的优势,向下游配售电业务拓展,打造“发电、配电、售电”产业链。

大盘跌倒,“电茅”新高

图片来源:公司公告

目前已建和规划的配网面积超220平方公里、35千伏以上等级的变电站45座,配网线路总长3180公里。

三峡水利去年完成资产重组,装入了四家重庆本地的电网公司。作为公司未来发展配售电业务的上市平台,预计待其他地区配售电资产成熟后,也会陆续装入三峡水利。

配售电领域主要对外投资:

大盘跌倒,“电茅”新高

数据来源:公司财报

 04 现金奶牛有多“奶”

2016年溪洛渡、向家坝资产注入后,公司的经营活动现金流稳定在360-390亿元,自由现金流则稳定在370亿上下,未来“乌白”注入后,自由现金流可再增厚约200亿。水电作为绿色可再生能源受到国家政策保护,受经济波动影响小,预计未来充沛的现金流将会延续。

大盘跌倒,“电茅”新高

数据来源:公司公告

公司的净现比常年接近于2,每实现1元的净利润,实际流入近2元的现金。

公司近4年净现比:

大盘跌倒,“电茅”新高

数据来源:公司财报

管理层也比较实在,上市以来累计现金分红约1083.6亿元,并将分红政策写入了公司章程。现金分红2016-2020年每股不低于0.65元,2021-2025年不低于当年实际净利润的70%。

大盘跌倒,“电茅”新高

数据来源:公司公告

 05 投资与扩张

每当公司有充沛的现金流的时,往往就和人一样,有暴发户心态,四处去投资。但是投资是把双刃剑,投好了会所嫩模,投砸了亏钱不说,还会拖累主业,实际中被乱投资拉垮的公司不胜枚举。

大盘跌倒,“电茅”新高

图片来源:公司公告

在这一点上,长江电力做的还算是不错,首先是对投资比较克制,利润中的大部分都回馈给了股东。另一点就是投资是围绕主营业务进行的,除了获取投资收益的补充外,更重要的是服务好主业,让主业有更宽的护城河。

截至2020年中期,公司长期股权投资中82.7%是在电力领域,其中综合发电板块占到50.8%,水电板块占到22.5%,配售电板块占到8.4%。

2020H1 长江电力对电力行业公司持股情况:

大盘跌倒,“电茅”新高

注:含长江电力一致行动人持股,资料来源:公司财报

在对内投资上,近年来对上市公司的股权增持明显加速。并通过股权增持或派驻董事等方式施加重大影响,将大部分标的纳入权益法核算。

采用权益法核算的好处是可及时、稳定地确认被投资标的业绩,同时不会因被投资标的股价波动而产生公允价值变动损益,对利润表的贡献程度更稳定。但缺点是不以现金分红为前提,利润表与现金收入可能存在背离。

公司的投资收益从2011年的11.2亿增长至2019年的31亿,始终保持在利润总额的10%上下。2020H1实现投资收益22.45亿元,同比增长17.79%,投资收益再创历史同期新高。

大盘跌倒,“电茅”新高

数据来源:公司公告

在国际业务上,2016年参与收购BCP Lux海上风电项目,项目总装机容量28.8万千瓦。截至2019年底,累计收到现金回报5,127万欧元。

2019年以35.9亿美元收购秘鲁第一大电力公司路德斯,其配售电业务占秘鲁市场28%,并且拥有10万千瓦已投产的水电资产,以及73.7万千瓦的水电储备项目,2019年净利润1.92 亿美元。

可见,无论是国内投资,还是国外投资,长江电力都是围绕主营业务向外延伸的。

 06 写在最后

最后,前段时间我在会员群里看到,有朋友问如何给企业估值,很多时候金融估值模型与其说是工具,不如说更像是一种思维方式,因为很多估值参数是基于假设取值的,市场与企业的情况是随时变化的,可能一个新的财报出来,之前的假设也就不存在了。

但是长江电力成熟的资产性质、稳定的现金流与分红,具有企业估值模型案例中的典型特征,我们下一篇,就以长江电力为案例分析下企业估值模型。

转自:https://mp.weixin.qq.com/s/6GrerASkj_KjvJcIbMcXww

最夸张的房子!一个月涨两万,怎么控制?

 

作者| 猫哥

来源| 大猫财经(ID:caimao_shuangquan)

 

最夸张的房子!一个月涨两万,怎么控制?

 

最近,杭州一个小区非常的“狂”。

 

在小区的宣传公告栏上,“热烈祝贺小区房价突破70000”,大红的背景,确实是非常喜气,如此高调地宣传和庆祝,颇有点普天同庆的架势。

 

最夸张的房子!一个月涨两万,怎么控制?

 

别说,还真如此牌子上说的那样,这个小区的房价真的是“旗开得胜,再创新高”。

 

杭州的房价在全国排行前十,36546元/㎡的均价属实不低,也算是配得上杭州的身价和地位,这个小区卖7万,着实不便宜,最令业主欣喜的是这价格还没到头,根据最新的平台行情,这个小区最新的挂牌均价已经到了7.9万,最高挂牌价已经到了8.49万/㎡了!

 

最夸张的房子!一个月涨两万,怎么控制?

 

这个小区隔壁同名的公寓价格只有两万出头,价差接近4倍,为啥这么悬殊呢?

 

学区闹的。

 

附近有一个中学跟杭州最好的民办中学搭上了关系,学区瞬间就更值钱了,那个超高的升学率,就是房价上涨最大的底气。

 

挂牌价一路高涨,一个月房价涨2万多,业主也美翻了。

 

搭上好学区,房价就能扶摇直上,早就不是啥秘密了。

 

最夸张的房子!一个月涨两万,怎么控制?

 

 

学区房咋来的?

 

其实来自于一场“减负”运动。

 

“取消小升初考试,实行划片就近入学”,这项政策其实源于80年代末,为普及九年义务教育,国家也是操碎了心的。

 

但是,哪个学校好,家长心里还是门清的,不是上近的,而是上好的。

 

上有政策下有对策,能用关系和钱解决的问题就不是大问题,学生考得好,学校也愿意要,再不济交点“借读费”、“择校费”,好中学也是可以上的,不仅是是拼面子和票子,也得拼孩子,成绩好,到哪儿都是香饽饽。

 

那时候学区房还远远算不上刚需。

 

后来,“中小学生课业负担过重”又成了问题。

 

1994年,当时的国家教委发布了一个减轻中小学生过重课业负担的意见,给中小学生减负的同时,再次强调“小学毕业生免试就近入学”。

 

1995年,教委又开始发文治理乱收费的事儿,并在第二年对“择校费”这事儿开始一波大整治,1997年,上海取消统考,正式实施就近入学,后来北京也跟进。

 

在经历了近10年的真空期后,小升初的游戏规则才算正式确立起来,后来在新修的《义务教育法》里面,这事儿就正式法定了。

 

学生减负了,家长也减负了,但“就近入学”成了一块心病。

 

教育资源分布不均,这是现实问题,重点中学的名号可以取消,但是要让孩子上重点中学的心确实日益迫切,如果用钱能砸开重点中学的大门,“鸡娃”的家长是不会吝惜的。

 

那就看学校要什么吧。要择校费,那就交钱,要凭房产入学,那就买房。

 

于是,新时代的“孟母三迁”就来了,有能力的家庭,纷纷向重点学校的学区挺进。

 

于是,学区房就成了各个城市的香饽饽,妥妥的刚需。

 

最夸张的房子!一个月涨两万,怎么控制?

 

家长们的心理被拿捏得死死的,学区房成了一块肥肉。

 

在中介眼里,家长们爱抢学区房,学区房是最好卖的房子,中介费可以拿到手软;在炒房者眼里,有优质学区就不愁卖不上价,赚钱也可以到手软。

 

2016年,北京文昌胡同“11.4㎡、46万/㎡”的一套老破小,一直是中国学区房的单价纪录,虽然后来被查实这笔交易金额不准确,46万没有,只有28万。

 

但没多久,隔壁的东铁匠胡同的报价已经超过30万/㎡。

 

最夸张的房子!一个月涨两万,怎么控制?

 

而在同一学区的文华胡同,报出了61万/㎡的单价,而面积只有6㎡,当然,这房子是不太好住人的。这么看,后来在六铺炕成交的那个单价30万的“储物间”以及爱民里单价12万的地下室,都算是良心了。

 

只有北京的学区房是这样的老破小吗?

 

在厦门,有一套6.8平方米的迷你学区房,“牛牵进去都转不出来”,甚至不如一个卫生间大,但是能挂户口能上优质学区,一口价148万,单价21万。

 

最夸张的房子!一个月涨两万,怎么控制?

 

在南京,一套墙壁破损墙面发霉的老一居,就是因为隔壁就是金陵汇文学校,单价就能开到10万,而南京的均价才3.2万。

 

最夸张的房子!一个月涨两万,怎么控制?

 

在不少没孩子的人看来,学区房就像“智商税”,有这个钱干啥不行?

 

但是家长们不这么看,再苦不能苦教育啊,所以有的主动、有的被裹挟,大家纷纷加入教育竞赛,投入个几百万、上千万培养一个孩子在大中城市算是很正常的事了。

 

当家长被拿捏住了,那么这中间的猫腻就更多了,中介敢把旁边有学校的房子都搞成学区房来卖,开发商就更敢了,卖房的时候承诺学区,然后溢价卖,等到兑现不了的时候,反正合同签了,钱也交了,房子已经卖出去了。

 

最夸张的房子!一个月涨两万,怎么控制?

最夸张的房子!一个月涨两万,怎么控制?

 

但是,这么贵的资产,也很脆弱,因政策而来,也有可能因政策而去。

 

从去年底到今年初,学区房又走出了一波行情,像北京某区基本是出一套卖一套,基本算是秒空了,十几万一平米的老破小,都需要抢。

 

炒得太凶总会有人管的,于是不少地方都“禁止炒作学区房”了,不过这也没什么用,去了这仨字,其中的内涵还在。

 

学位的变化才是最要命的。

 

这两天,深圳龙岗的部分小区的业主在闹腾,因为龙岗宣布全区试行“大学区制”,并且一些学区做了微调,一点风吹草动,就足够家长们操心的,如果自己的积分拼不过人家老住户,那么自己孩子上名校的希望就要落空。

 

如果不能上名校,那么自己也面临着资产缩水。

 

而在上海浦东,一个“多校划片”传言,让学区房业主惊魂未定。

 

“多校划片”就是一个小区对应多个学校,至于去哪所学校,通过摇号来决定,这个时候,即便是买了学区房,能不能上附近的名校,又成了概率问题。

 

学区房业主们急了,要求浦东倾听一下购买学区房家长们的心声,在信里面提到“完全的公平就是最大的不公平”、“不想买学区房的家长们盼着被抽中,天上掉馅饼”,大有挞伐不买学区房的家长的架势。

 

最夸张的房子!一个月涨两万,怎么控制?

 

但是,更戏剧性的是,这群学区房的业主们,在各地都在为学区房降温的当口上,要求浦东官方为学区房托市,颇有点提油救火的感觉。

 

官方非常抗拒学区房的说法,为了防止炒作,不少中介平台已经不再提及“学区房”的概念了,2022-2024年又是一个入学大年,学肯定是可以上的,但是学区房炒作也别太过分,不少地方已经开始用学区预警、卡落户年限的方式,来收紧政策了。

 

孩子的教育问题,要家长靠房子解决,而家长们买的房子,又要靠教育来调控,确实还挺迷幻的。

 

最难解决的两件事儿缠在了一起,短时间内还真就是无解。

 

最夸张的房子!一个月涨两万,怎么控制?

本文系网易新闻·网易号“各有态度”特色内容

转自:https://mp.weixin.qq.com/s/n8V4KIRvn_RhMhu8tKSIAA

中金:抽丝剥茧,详解在线K-12教培经济模型

/ 赵丽萍 钱凯

来源/ 中金点睛(ID:CICC_Perspective)

 

导语

 

随着在线教育营销获客规范度提升,我们认为未来一段时间在线教育机构的线上投放获客将暂缓,有利于已形成较高用户规模的在线教育头部玩家,同时,获客难度抬升将对各家机构线上投放以外的获客能力形成挑战。

 

 

本篇报告中,我们针对在线一对一、在线小班、在线大班三种教学模式,系统梳理其适宜客群、优势、劣势;搭建在线教育单位经济(UE)模型、单用户全生命周期价值(LTV)模型分析框架,并通过详细的调研得到模型中关键变量的最新行业情况,分析了三种教学模式的盈利情况与关键性指标。

 

在线一对一解决成绩提升痛点,适合升学年级客群。在线一对一的个性化与监督性强、教育效果好、排班灵活,其瓶颈在于师资成本较难降低导致毛利率偏低(基于行业数据假设的测算结果约为53%),学生参培周期较短,过去一对一行业获客竞争较为激烈、盈利较为困难,但随着行业出清,目前头部的企业面临竞争降低,已经可以实现盈利,其提升盈利能力的关键在于提升转介绍率,降低电销、投放渠道获客成本。

 

在线小班解决效果、教学资源痛点,适合低年龄层客群。在线小班本地化程度较高、互动性与监督性较强、教学效果与经济性平衡,毛利率处于三种教学模式的中等水平(基于行业数据假设的测算结果约为64%)。目前在线小班UE模型已经能够跑通。小班模式下老师成本固定,班均人数提升明显改善利润水平,是其最重要的盈利性改善监测指标。在线小班瓶颈在于培养教师、排班难度较高,规模化较慢,是分析小班模式长期发展应重点关注的问题。

 

在线大班解决价格、名师资源痛点,适合高年龄层客群。其优势在于价格较低、师资质量高、经营成本低、运营效率高,毛利率处于三种教学模式的最高水平(基于行业数据假设的测算结果约为76%),其瓶颈在于产品同质化、投放竞争激烈导致获客成本高企,目前在线大班机构首单盈利仍不清晰,但通过转化率、续班率的提升可以实现学生参培生命周期的盈利。大班模式长期发展的决定因素在于教学效果的改善、在线价值的释放。

 

在线教育将由获客竞争走向品牌打造、产品丰富。我们认为,在线教育机构营销获客问题被点名,线上投放获客占整体获客比重将有所下降,差异化获客能力将对教培机构短期竞争力起到更加重要的作用;长期竞争力则在于打造品牌,以增加口碑渠道获客、提高用户留存率;丰富产品,以覆盖不同需求的用户族群、实现产品间学生与教师资源的互相导流。

 

风险

 

在线教育监管相关政策超预期;线上投放以外渠道获客效果远低于线上投放。

 

 

1

 

模式之争:多维度透视大班、小班、一对一

 

 

Q1. 在线K-12教学模式演变过程如何?主要玩家有哪些?

 

在线K-12教学模式目前主要被划分为三类,即大班、小班、一对一。线下教培最早从新东方名师大班课兴起,其后好未来以小班模式进入教培市场、学大教育开启了一对一教学模式,线下大班模式由于其扩班容与提教学点密度互相制约,学生到达教学场所便捷性较差、教学效果一般、名师流失率较高等原因已经几近消失,小班、一对一成为线下教培的主流模式。在线教培的教学模式演变则是一个与线下教培机构相对逆向的过程:

 

图表: 在线教育教学模式演化

资料来源:公司公告,中金公司研究部

 

在线一对一为早期最受瞩目的在线教育模式。在线教育兴起的初期,由于视频、交互技术水平较低,行业主要采用录播课的形式。2013年开始,在线教育从录播课走向直播课的转换中,VIPKID、哒哒英语、海风教育、掌门等采用一对一教学模式的机构率先崛起。其后,受益于带宽容量扩大、互联网技术提升与在线教培机构教学方法改善,在线班课教学效果提升,在线教育主流模式从一对一向班课延伸。

 

图表: 在线教育机构融资情况

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:公司公告,中金公司研究部

 

在线大班从2015年兴起,2018年起受到市场高度关注。2015年,学而思网校率先推出在线大班模式。2016年,猿辅导开始发展班课;作业帮直播课程上线;腾讯上线腾讯企鹅辅导。2018年,资本开始涌入在线大班细分赛道。2019年,在线教育机构为争夺生源,暑期广告投放总额约40亿人民币。2020年在疫情影响下,在线教育渗透率大幅提升,在线大班是最能够迅速承接大量用户的教学模式,相关在线教育机构投放、融资力度进一步加大,2020年,好未来、猿辅导、作业帮、跟谁学分别累计融资48亿美元、35亿美元、23.5亿美元和8.7亿美元。

 

图表: 在线教育机构月活跃用户数大幅上涨,回落后仍高于疫情前水平

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:Quest Mobile,中金公司研究部

 

在线小班受关注程度逐渐提升。2016年,新东方旗下东方优播入局在线小班模式,其后一段时间进入这一细分赛道的学科应试类教培机构相对较少,经过2018-2020年连续三年狂热的在线教育营销,以及2020年疫情影响下的“被迫”触网,家长、学生对于在线教育产品的鉴别能力逐渐提升,效果较好的在线小班走到聚光灯下:2020年,素质教育类教培机构中,获得细分赛道投资金额排名靠前的火花思维、豌豆思维、编程猫,均以小班模式开展教学;学科应试类教培机构中,掌门优课推出精品小班;上海学而思发布在线小班课;字节跳动推出小班制直播教学产品“清北小班”。

 

Q2. 不同在线K-12教学模式解决的痛点、优势、劣势是什么?

 

图表: 在线教育不同教学模式特征对比

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:中金公司研究部

 

一对一

 

在线一对一解决成绩提升痛点,适合升学年级客群。在线一对一多为单师模式,教研教学、课后答疑、监督辅导基本由主讲老师完成,适宜解决学生相对明确的个性化学习、成绩提升要求,其最主要的客群为初三、高三等升学年级学生,该类学生面临中考、高考压力,对于成绩提升具有最为强烈、迫切的需求。

 

图表: 掌门教育在线一对一授课界面

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:公司官网,中金公司研究部

   

图表: 报名K12学科应试的核心动机侧重分数提升   

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:2020年腾讯营销洞察K12与学前教育行业洞察,中金公司研究部

 

在线一对一具有个性化与监督性强、教学效果较好、排班较为灵活的特征:中科院《中国K12在线教育市场调研及用户消费行为报告》显示,47.5%的家长表示给孩子报课时,一对一是第一选择,主要源于家长认为一对一的教学效果最好、实施个性化教学、老师对学生监督程度高。基于一对一教学模式的强个性化、监督性,其对学生成绩的提升效果明显。根据腾讯营销洞察的调查结果,成绩提升仍是现阶段家长、学生选择学科类K12产品的首要诉求,一对一是最适合打造应试型产品的教学模式。在线一对一模式相比班课,可以根据学生情况较更灵活地调整教学时间,打破空间、时间限制,排班效率较高。

 

在线一对一的瓶颈在于师资成本刚性、获客成本较高、学生参培周期较短:在一对一模式下,培训机构师资需求量大,教师成本占比较高,教培机构为降低教师成本多聘请兼职教师,但2018年以后教培行业监管落地,要求校外线上培训机构,不得聘用中小学教师,学科知识培训老师应当具有国家规定的相应教师资格证,一对一教学模式教师成本、合规成本受到较大挑战。在线一对一机构主要通过转介绍、广告投放、电话销售等方式获取用户,获客成本较高。此外,一对一主要客群为升学年级学生导致用户的参培生命周期较短,教培机构通过提升续费获得高生命周期价值的难度高于其他模式。

 

小班

 

在线小班解决效果、教学资源痛点,适合低年龄层客群。学科类在线小班的典型教学模式为一位主讲老师带15-25位学生的班课,采用师生能够看见彼此的直播方式,学生视频窗口在教学页面上轮转展示。在线小班主要解决不同区域内相对高支付能力家庭的资源问题。主要玩家如关注低线城市的东方优播,通过向低线城市输送高线城市老师的课程,解决当地高支付能力家庭对高质量师资的需求问题;关注高线城市的学而思在线小班课,解决高线城市家庭报名线下小班课困难的资源问题。低年龄层学生自制力相对较弱,对课堂互动及课后服务的需求更高,因此在线小班课较适用于学前、小学客群。

 

图表: 东方优播在线小班授课界面

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:公司公告,中金公司研究部

 

在线小班主要具有本地化、互动性与监督性较强、教学效果与经济性平衡的特征:学科类在线小班教学模式贴近线下小班,多采用本地化教研,针对不同区域的学生,设计并教授使用当地教材、贴近当地教学进度的课程。在线小班教学过程中,教师可以有效关注到学生的表现并进行提问,师生具有较强的互动性,同时相比在线大班,在线小班的主讲老师也会负责课后辅导环节,课程中、后对学生的监督性均较强。得益于本地化教学与较强的互动性、监督性,在线小班的教学效果优于大班模式,同时其运营成本低于一对一模式,是一种兼具效果性、经济性的模式。

 

在线小班的瓶颈在于培养教师团队与运营难度高、规模化较慢:对于采用小班教学模式的机构,需要其具备内生培养相当数量的、合格的主讲老师,以及组建教研团队的能力,但这一点也提高了在线小班模式的准入门槛,有助于已有玩家构筑其经营壁垒。小班涉及本地化、教学分层,在发生招生不利的情况下,需要处理班级合并、取消等问题,牵涉学生能否报课成功、老师收入波动问题,整体运营难度较大。由于对教培机构师资、教研供应链的要求较高,在线小班起量速度较慢,2020年秋季在线大班头部机构正价课人次规模在百万级水平,学科类在线小班模式的代表东方优播正价课人次规模在十万级水平,素质类在线小班模式的代表火花思维、编程猫各自正价人次规模在30万人左右。

 

图表: 在线K-12机构2020年秋季正价学生规模对比

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:公司公告,中科院2020年中国在线教育网课市场白皮书,中金公司研究部

 

大班

 

在线大班解决价格、名师资源痛点,适合高年龄层客群。在线大班多采用双师授课,即主讲老师+辅导老师,主讲老师负责远程授课,辅导老师负责维护课堂秩序、课后答疑、教学进度跟进。机构多主打为学生提供传授知识点、学习方法与解题技巧的高性价比名师课程。对于初、高中学生,升学压力的临近使其具有更为刚性的应试需求,普遍自制力更强,在线大班课程较适用于该类高年龄层学生客群。

 

图表: 猿辅导在线大班授课界面

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:公司官网,中金公司研究部

 

在线大班主要具有价格、师资质量、经营成本、运营效率的优势:在线大班价格明显低于其他模式的同类在线课程,对于高线城市的低支付能力、距教学点距离较远的家庭具有较高的吸引力。师资方面,各方面评定显示,在线教学三种模式中,在线大班师资质量最高,同时,大班模式下在线机构围绕名师打造获客、教研、辅导团队,可以让名师触达、吸引、服务更多的用户,能够充分发挥优秀师资作用。成本方面,在线大班具有随着班均的提升主讲老师的边际成本明显降低的特征,加之在线大班均容量天花板较高,其相比其他教学模式具有明显的成本优势。运营效率方面,在线大班主要推出针对人教版、北师版等全国使用度较高的教材内容的教培产品,排班效率较高,较容易提升用户规模。

 

在线大班最主要问题为教学个性化、互动性较低、产品同质化导致获客成本高企:各家机构主要推出面向全国的课程,有助于提升班均人数、减低成本,但也导致了同一班级中学生学业水平不一、来自地域不同、学习进度不一,却共用同一种教学产品,学习体验相对较差。同时,主讲老师面对成百上千名学生,无法有效做到传统课堂的监督、教学互动,机构寄希望于辅导老师为学生创造小班、个性化体验,但往往较难实现。同时,各机构目前产品同质化较严重,对广告营销争夺客源的依赖性较强,进而推高市场获客成本、导致在线大班模式盈利困难。

 

 

2

 

经济模型:剖析在线教育盈利情况、关键指标

 

 

在定性对比三类在线教育模式特征后,我们在这一部分将进一步介绍在线教育的定量分析方式及基于定量分析得到的在线教育不同模式的盈利情况、关键指标。在线教育最主要的经济模型为单位经济模型(后续简称UE模型)与单用户全生命周期价值模型(后续简称LTV模型),其中:

 

UE模型主要用于分析一个学期单班(单位数量学生)的利润情况,其较适合测试不同教育模式产品的基本盈利能力,以及影响利润的关键性指标。我们力求简洁并突出最具关键性影响的指标,设计在线教育UE模型分析框架如下图,并将在后续章节应用UE模型逐一分析在线一对一、在线小班、在线大班的盈利情况。

 

图表: 在线教育UE模型框架

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:中金公司研究部

 

在线一对一UE模型

 

对于一对一模式,我们参考掌门一对一、VIPKID等主要教培机构数据,进行核心变量假设:1)单个用户课时价格150元/人,课时数40课时;2)主讲老师课时费60元/课时;3)电销、投放渠道正价课学生获客成本4000元/人;转介绍渠道正价课学生获客成本800元/人;4)转介绍率50%。基于上述假设,在线一对一主讲老师成本占收入约40%,毛利率水平约53%,处于三种教学模式中较低水平,过去一对一行业获客竞争较为激烈,盈利较为困难,但目前随着行业出清,最头部的企业在提升转介绍率、降低获客成本至行业低位的情况下,已经可以实现盈利。

 

图表: 在线一对一UE模型核心假设

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:公司官网,中金公司研究部,注:基于行业平均数据

 

图表: 在线一对一UE拆分   

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:中金公司研究部,注:假设单位为1000名学生

 

在线一对一关键:提升课程单价、降低获客成本

 

► 课程单价:我们认为提升课程单价是在线教育所有教学模式提升收入,实现盈利的有效方式之一,但对一对一模式尤为适用。将教学从线下转换至线上的过程中,一对一模式相比班课模式,监督程度、教学效果相比线下折损情况较低,线上定价也应比其他模式更接近线下定价。对比线下一对一行业定价,目前在线一对一仍处于提供大幅优惠价格阶段,我们认为未来单价有望逐步提升。根据敏感性分析,提升单位用户课时收入,即使维持较高昂的获客成本,在线一对一仍能实现盈利。

 

► 获客成本与转介绍率:在线一对一主要针对升学年级学生,留存率较低,导致机构需要不断拉新提升用户规模,除转介绍渠道,通过电销、投放获客的成本仍较高,单位正价学生获客成本较高昂。但是随着各在线一对一机构对用户学段的拓展,我们认为学生留存率有望提升,同时机构也在提升精细化运营能力以提高转介绍率,二者均可降低单位正价用户中通过电销、投放获客的比例,进而降低整体获客成本。

 

图表: 在线一对一营业利润率敏感性分析

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:中金公司研究部

 

在线小班UE模型

 

对于小班模式,我们参考东方优播、火花思维等主要教培机构数据,进行核心变量假设:1)单个用户课时价格70元/人,班均人数15人,课时数30课时;2)主讲老师课时费300元/课时;3)低价班学生获客成本150元/人,转化率15%;4)续班率75%。基于上述假设,在线小班教师成本占比适中,毛利率水平约64%,处于在线教育三种模式中等水平,同时,获客成本处于最低水平,在线小班细分赛道单位经济模型已经能够跑通。

 

图表: 在线小班UE模型核心假设

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:公司官网,中金公司研究部,注:基于行业平均数据

 

图表: 在线小班UE拆分

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:中金公司研究部,注:假设单位为1000名学生

 

在线小班关键:提升班均人数

 

► 班均人数:在线小班教师成本为固定成本,班均人数是最关键的经营指标。在一对一教学模式中,主讲老师成本为可变成本,其薪资随带班课时数提升而提升;在大班教学模式中,主讲老师成本相对固定,但辅导老师成本可变,其数量随班级容量扩大同步增加;在小班教学模式中,主讲老师薪资相对固定,根据敏感性分析结果,随着班级容量的提升,主讲老师成本被摊薄,在线小班利润水平提升明显。目前,主要机构已经在尝试提高低价班班容,在维持转化率的情况下,正价班班容将同步提高,进一步提升产品盈利能力。

 

图表: 在线小班营业利润率敏感性分析

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:中金公司研究部

 

在线大班UE模型

 

对于大班模式,我们参考学而思网校、高途课堂、猿辅导、作业帮、新东方在线等主要教培机构数据,进行核心变量假设:1)课时单价50元/课时,折扣率90%,班均人数2000人,课时数30课时;2)主讲老师课时费2000元/课时;3)辅导老师季度薪资40,000元,辅导老师师生比200比1;4)低价班学生获客成本420元/人,转化率15%;5)续班率70%。基于上述假设,在线大班主讲老师成本收入比重仅2%,辅导老师成本占比15%,在线大班毛利率水平76%,处于在线教育三种模式最高水平。

 

图表: 在线大班UE模型核心假设

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:公司官网,中金公司研究部,注:基于行业平均数据

 

图表: 在线大班UE拆分   

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:中金公司研究部,注:假设单位为1000名学生

 

在线大班毛利关键:辅导老师

 

在UE模型中,我们将主要讨论影响在线大班毛利率的指标,对在线大班营业利润率影响较大的指标将在后续LTV模型中进行分析:

 

►  辅导老师:相比于其他教学模式,在线大班模式中,辅导老师成本占收入比重远超主讲老师。辅导老师师生比的提升、辅导老师课时费的下降,均可促进在线大班毛利率的提升,但在线大班双师模式下,辅导老师承担着课程提醒、作业批改、课后答疑、续报沟通等重要的教学辅助与运营任务,是提升教学效果、学生学习体验的重要存在。辅导老师师生比提升、课时费降低将可能对学生的转化率、续报率产生负面影响,或导致辅导老师的流失,因而调节难度较大。

 

图表: 在线大班毛利率敏感性分析

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:中金公司研究部

 

在线大班LTV模型

 

LTV模型主要用于测算、对比单个用户生命周期收入与获客成本。由于竞争获客过于激烈,目前大部分主打线大班的教育机构仍处于首单亏损之中。在线大班的运营具有明显的季节性规律,往往夏季、冬季做新增获客,秋季、春季做留存续费,即通过低价入口班吸引学生报课,并提升转化率将学生尽可能多的转化为正价学员,再提升已有正价课学生的留存率、客单价、报课科目数,获得更多的学生参培生命周期收入,来对冲不断高企的获客成本。LTV模型可以有效的定量分析教培机构上述经营活动,测算新增学员全生命周期收入,判断对应获客成本是否处于健康状态。

 

图表: 在线教育LTV模型框架

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:中金公司研究部

 

我们参考主要在线大班教培机构数据,得到核心变量的行业范围并进行假设,基本假设与在线大班UE模型中假设一致,新增假设条件:1)课程价格无折扣;2)假设学生自暑期被机构获客,正价课存续6个季度,秋季、春季每季度30课时,冬季、夏季每季度15课时;3)平均每个学生参培科目为1.5科;4)主讲老师与辅导老师成本占比17%。基于上述假设,我们测算得到在线大班学生生命周期价值为5,304元,LTV/CAC为1.9,学生生命周期累计营业利润率为3%。

 

图表: 在线大班LTV模型核心假设

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:公司官网,中金公司研究部,注:基于行业平均数据

 

图表: 在线大班LTV模型

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:公司官网,中金公司研究部,注:基于行业平均数据

 

在线大班关键:续班率、转化率、获客成本

 

► 续班率和转化率:复利效应下,续班率的提升对于用户生命周期价值提升作用明显,目前在线大班平均续报率在70%左右,我们认为教学效果较好、运营能力较高的头部企业续报率有望达到80%-85%。目前,各机构对于续班率的定义并不统一,较严格的口径为科目对科目的续报,较宽松的口径则包括对相同与不同科目间的续报。转化率指低价班学员向正价班学员转化的比例,该指标对正价班学员获客成本影响明显,目前在线教育行业转化率在10%-30%,大部分机构的转化率仍具有提升空间。

 

图表: 在线大班LTV/CAC敏感性分析

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:中金公司研究部

 

► 获客成本:在线大班盈利的关键在于降低获客成本。基于我们的假设,在线大班学生生命周期盈亏平衡的正价班获客成本为2970元;其他指标不变情况下,正价班学员获客成本降低至800元将大幅提升在线大班学员生命周期营业利润率水平至41%。2020年,疫情影响下,学校与线下教培机构停课、学生出行受限,在线教育渗透率大幅提升,在线教育的营销投放竞争也越发激烈。我们认为未来在线教育营销投放将一定程度回归理性,在线大班盈利水平有望改善。

 

图表: 2020年部分在线大班机构广告投放情况

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:Quest Mobile,中金公司研究部

 

注:学而思系包括学而思网校APP、学而思轻课APP、学而思培优APP;猿辅导系包括猿辅导APP、猿题库APP、小猿搜题APP,作业帮系包括作业帮APP、作业帮直播课APP

 

图表: 在线大班营业利润率敏感性分析

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:中金公司研究部

 

 

3

 

发展趋势:由获客竞争走向品牌打造、产品丰富

 

 

差异化获客竞争是短期重点

 

在线教育产品定价主要取决于市场竞品定价及自身产品特性,目前在线教育产品同质化较为严重,彼此间课时单价差异较小,各家获客成本差异将直接影响其利润表现。2021年1月18日,政府点名在线教育投放问题,教育部基础教育司表示将多措并举持续规范校外线上培训。我们认为,在线投放获客成本价格逐年上涨且政府要求规范的环境下,差异化的获客方式将对公司竞争力的提升、业绩表现起到更加重要的作用。

 

图表: 部分在线教培机构获客侧重方式对比

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:公司公告,中金公司研究部

 

► 好未来:口碑渠道、非口碑渠道并行。2003年,好未来以学而思培优为主打品牌、以线下小班课模式起步;2010年,开设学而思网校,将业务从线下向线上拓展。目前,好未来主要通过口碑渠道与广告投放等非口碑渠道进行获客,受益于线下品牌溢出效应,用户规模增长稳健,2021财年第三季度,学而思网校与学而思在线正价课用户规模达217万人次。

 

► 新东方在线:品牌效应+地面获客精准定位。作为新东方旗下唯一的在线教育平台,新东方在线凭借新东方的强大品牌,在获客成本上建立了明显优势。不同于其他在线机构的大规模线上投放,新东方在线在其进入的城市开设线下体验店为其线上课程导流,降低获客成本的同时也有效地提高了客户留存率。截至2020年11月30日,公司在线小班品牌东方优播已经进入271个城市,在线大班业务已经进入100个低线。2021财年上半年,新东方付费K-12用户达到183.8万人次。

 

► 跟谁学:由社群营销转向广告投放。营销方面,跟谁学的原有的营销主要采用线上社群营销,营销渠道主要为腾讯系的微信公众号、腾讯广告及朋友圈;其次是头条、抖音等社群营销和搜索广告。2020年,跟谁学开始了大规模的广告投放,2020财年第二季度与第三季度跟谁学销售费用别达12.05亿元和20.56亿元。2020财年第三季度,跟谁学正价课付费人次达到114.7万。

 

► 猿辅导:题库掌握种子用户+搜题工具引流。猿辅导于2012年成立;2013年,上线主打初高中题库的猿题库;2014年,上线主打拍图识别并提供答案的小猿搜题;2015年,猿辅导推出在线大班课程,公司从初期的一对一直播向班课转型,主要依托猿辅导题库和搜题工具积累的大量用户基数向线上班课导流。2020年秋季,猿辅导招生突破220万人次,根据36氪报道2020年猿辅导确认收入超过100亿元。

 

► 作业帮:通过作业帮App引流。2015年,作业帮拍照搜题功能上线;2016年,作业帮直播课上线。作为百度系公司,作业帮在流量端具备明显优势,并通过线上同步练习、直播课方式进行班课的流量转化。2020 年,作业帮暑期付费课学员总人次 780 万,同比增长超过 390%,暑期正价班学员就读人次超过 171 万,同比增长超过 350%;暑期正价班新增人次中,超过67%来自自有流量。

 

► 掌门教育:转介绍+电话销售。掌门教育于2009年成立;2014年,转型在线一对一;2018年,成立在线少儿思维品牌掌门少儿;2019年,推出专注小学到高中课后辅导的在线班课品牌掌门优课。获客方面,掌门教育最主要的获客渠道为转介绍,其次为在线投放辅助电话销售激活,同时也在尝试掌门少儿向掌门1对1 的导流。2020年4月,亿欧报告显示掌门1对1单月耗课超过5亿元人民币。

 

打造品牌、丰富产品是长期根基

 

打造品牌口碑:教育是一个对效果、口碑要求很高的领域,中科院《2020年中国在线教育网课市场白皮书》调查显示家长在选择网课产品时,最看重的是平台口碑、师资力量配置、平台规模及课程设计。单纯的流量优势,不能支撑在在线教育企业的长远发展,阶段性的获客投入和成果,不能体现在线教育领域长期的市场格局走向。我们认为,在线教育机构业务增长的关键环节包括获客、转化、续班、扩科,随着广告投放获客成本、获客难度持续提升,竞争关键将转向做好已有用户的运营、通过口碑获客,基于教研体系、教学产品、师资质量的品牌口碑打造将成为在线教育机构竞争力提升的关键。

 

图表: 在线教培机构简化运营漏斗

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:中金公司研究部

 

图表: 用户选择网课最看重的因素   

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:中科院2020年中国在线教育网课市场白皮书,中金公司研究部  

 

建立产品矩阵:我们认为未来大型在线教培机构均会包含多条产品线,建立自身产品矩阵,主要基于以下三点原因:

 

1)提供丰富产品,应对不同族群需求。我们认为,K-12客户的需求差别较大,东方优播朱宇曾提出K-12市场可根据支付能力、学生成绩、需求刚性程度三个维度的高、中、低水平划分为27个细分市场。未来各机构需要从单一教学模式向多个教学模式拓展,以满足不同细分市场用户族群的需求,提升市场占有率。

 

2)模式间客户导流,提升用户留存。经过过去三年的获客大战,各教培机构已经建立自身的用户池,我们认为在获客难度提升的情况下,教培机构将更加注重用户的留存,通过不同教学模式间用户的导流,尽可能将用户留存在自己的服务体系内。

 

3)模式间教师导流,提升师资留存。对比三种教学模式主讲老师薪资水平,一对一<小班<大班,随着工作经验的增加、能力的提升,部分老师开始面临上升空间受限的问题,具有较大的流失风险,我们认为,机构需要为优秀的教师提供由向更多的学生授课、获取更高的薪酬的机会,不同教学模式间教师的导流,有利于机构发挥优秀师资作用,保持自身供应链优势。

 

图表: 在线教育产品间学生、教师导流

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:中金公司研究部

 

图表: 主要在线教育机构产品布局

中金:抽丝剥茧,详解在线K-12教培经济模型

资料来源:普华永道,中金公司研究部

 

风险提示:“中金公司相关文章或研究报告的内容和观点、分析均为参考性质,不构成任何投资决策的依据和要约(邀请),中金公司不承担据此进行投资交易所产生的任何风险及损失。”

 

文章来源:本文转载自公众号中金点睛(ID:CICC_Perspective),中金公司享有完整的著作权;文章作者:赵丽萍 钱凯;发布日期:2021年2月24日。

 

本文非鲸媒体采编文章,不代表鲸媒体观点

– END –

转自:https://mp.weixin.qq.com/s/CdF348Ej15dcex3dWoLBuw

花了两天,终于把 Python 的 setup.py 给整明白了

来自公众号:Python编程时光

1. 为什么需要对项目分发打包?

平常我们习惯了使用 pip 来安装一些第三方模块,这个安装过程之所以简单,是因为模块开发者为我们默默地为我们做了所有繁杂的工作,而这个过程就是 打包

打包,就是将你的源代码进一步封装,并且将所有的项目部署工作都事先安排好,这样使用者拿到后即装即用,不用再操心如何部署的问题(如果你不想对照着一堆部署文档手工操作的话)。

不管你是在工作中,还是业余准备自己写一个可以上传到 PyPI 的项目,你都要学会如何打包你的项目。

Python 发展了这么些年了,项目打包工具也已经很成熟了。他们都有哪些呢?

你可能听过 disutilsdistutilsdistutils2setuptools等等,好像很熟悉,却又很陌生,他们都是什么关系呢?

2. 包分发的始祖:distutils

distutils 是 Python 的一个标准库,从命名上很容易看出它是一个分发(distribute)工具(utlis),它是 Python 官方开发的一个分发打包工具,所有后续的打包工具,全部都是基于它进行开发的。

distutils 的精髓在于编写 setup.py,它是模块分发与安装的指导文件。

那么如何编写 setup.py 呢?这里面的内容非常多,我会在后面进行详细的解析,请你耐心往下看。

你有可能没写过 setup.py ,但你绝对使用过 setup.py 来做一些事情,比如下面这条命令,我们经常用它来进行模块的安装。

$ python setup.py install

这样的安装方法是通过源码安装,与之对应的是通过二进制软件包的安装,同样我也会在后面进行介绍。

3. 分发工具升级:setuptools

setuptools 是 distutils 增强版,不包括在标准库中。其扩展了很多功能,能够帮助开发者更好的创建和分发 Python 包。大部分 Python 用户都会使用更先进的 setuptools 模块。

distribute,或许你在其他地方也见过它,这里也提一下。

distribute 是 setuptools 有一个分支版本,分支的原因可能是有一部分开发者认为 setuptools 开发太慢了。但现在,distribute 又合并回了 setuptools 中。因此,我们可以认为它们是同一个东西。

还有一个大包分发工具是 distutils2,其试图尝试充分利用distutils,detuptools 和 distribute 并成为 Python 标准库中的标准工具。但该计划并没有达到预期的目的,且已经是一个废弃的项目。

因此,setuptools 是一个优秀的,可靠的 Python 包安装与分发工具。

那么如何在一个干净的环境中安装 setuptools 呢?

主要有两种方法:

  • 源码安装:在 https://pypi.org/project/setuptools/#files 中下载 zip 包 解压执行 python setup.py install 安装

  • 通过引导程序安装:下载引导程序,它可以用来下载或者更新最新版本的 setuptools

$ wget http://peak.telecommunity.com/dist/ez_setup.py

# 安装
$ python ez_setup.py

# 更新,以下两种任选
$ python ez_setup.py –U setuptools
$ pip install -U setuptools

4. easy_install 使用指南

当你安装完 setuptools 后,就拥有了一个叫做 easy_install 的第三方管理工具,这也是它区分于 distutils 的一大改进。

这里简单介绍一下它的用法,虽然它已经用得非常少了。

先是包的安装

# 通过包名,从PyPI寻找最新版本,自动下载、编译、安装
$ easy_install pkg_name

# 通过包名从指定下载页寻找链接来安装或升级包
$ easy_install -f http://pythonpaste.org/package_index.html 

# 指定线上的包地址安装
$ easy_install http://example.com/path/to/MyPackage-1.2.3.tgz

# 从本地的 .egg 文件安装
$ easy_install xxx.egg

# 在安装时你可以添加额外的参数
指定安装目录:--install-dir=DIR, -d DIR
指定用户安装:--user

再者是包的升级

# 从 pypi 中搜索并升级包
$ easy_install --upgrade pkg_name

# 指定版本进行升级
$ easy_install "SomePackage==2.0"

最后是包的删除

$ easy_install -m pkg_name

需要注意的是,这样的删除,仅是在 easy-install.pth 文件中删除,使其不能在 python 中使用 这个模块,但实际的包还在你的电脑中,若要删除彻底,需要你手动删除相关的 .egg 及 其他文件。

默认情况下,easy_install 只会从 pypi 上下载相关软件包,由于这个源在国外,下载包的速度并不理想,使用过pip的朋友自然会想,easy_install 是否能指定源进行安装呢?

答案是,可以的。

编辑配置文件 /root/.pydistutils.cfg

[easy_install]
index-url=http://mirrors.aliyun.com/pypi/simple/
find-links=http://mirrors.aliyun.com/pypi/simple/

以上仅介绍了 easy_install 的一些常用的方法,想要了解更多,你可以点击官方文档:https://setuptools.readthedocs.io/en/latest/easy_install.html

总结一句:setuptools 是官方提供的一个专业用于包分发的工具,若只从安装的角度来看,它的功能确实简单。它更大的意义是对包的分发很有用,定制化程序非常高,我们现在也还在用它进行版本包的发布。

5. 源码包与二进制包什么区别?

Python 包的分发可以分为两种:

  1. 以源码包的方式发布

源码包安装的过程,是先解压,再编译,最后才安装,所以它是跨平台的,由于每次安装都要进行编译,相对二进包安装方式来说安装速度较慢。

源码包的本质是一个压缩包,其常见的格式有:

花了两天,终于把 Python 的 setup.py 给整明白了
  1. 以二进制包形式发布

二进制包的安装过程省去了编译的过程,直接进行解压安装,所以安装速度较源码包来说更快。

由于不同平台的编译出来的包无法通用,所以在发布时,需事先编译好多个平台的包。

二进制包的常见格式有:

花了两天,终于把 Python 的 setup.py 给整明白了

6. eggs 与 wheels 有什么区别?

Egg 格式是由 setuptools 在 2004 年引入,而 Wheel 格式是由 PEP427 在 2012 年定义。Wheel 的出现是为了替代 Egg,它的本质是一个zip包,其现在被认为是 Python 的二进制包的标准格式。

以下是 Wheel 和 Egg 的主要区别:

  • Wheel 有一个官方的 PEP427 来定义,而 Egg 没有 PEP 定义

  • Wheel 是一种分发格式,即打包格式。而 Egg 既是一种分发格式,也是一种运行时安装的格式,并且是可以被直接 import

  • Wheel 文件不会包含 .pyc 文件

  • Wheel 使用和 PEP376 兼容的 .dist-info 目录,而 Egg 使用 .egg-info 目录

  • Wheel 有着更丰富的命名规则。

  • Wheel 是有版本的。每个 Wheel 文件都包含 wheel 规范的版本和打包的实现

  • Wheel 在内部被 sysconfig path type 管理,因此转向其他格式也更容易

wheel 包可以通过 pip 来安装,只不过需要先安装 wheel 模块,然后再使用 pip 的命令。

$ pip install wheel
$ pip wheel --wheel-dir=/local/wheels pkg

7. 超详细讲解 setup.py 的编写?

打包分发最关键的一步是编写 setup.py 文件。

以下是一个 setup.py 简单的使用示例

from setuptools import setup, find_packages

setup(
    name="mytest",
    version="1.0",
    author="wangbm",
    author_email="wongbingming@163.com",
    description="Learn to Pack Python Module  -->公众号:Python编程时光",

    # 项目主页
    url="http://iswbm.com/", 

    # 你要安装的包,通过 setuptools.find_packages 找到当前目录下有哪些包
    packages=find_packages()
)

接下来,我将慢慢扩充这个setup函数,增加更多的参数,以便你能理解setup函数能做哪些事情。

程序分类信息

classifiers 参数说明包的分类信息。所有支持的分类列表见:https://pypi.org/pypi?%3Aaction=list_classifiers

示例:

from setuptools import setup, find_packages

setup(
    classifiers = [
        # 发展时期,常见的如下
        #   3 - Alpha
        #   4 - Beta
        #   5 - Production/Stable
        'Development Status :: 3 - Alpha',

        # 开发的目标用户
        'Intended Audience :: Developers',

        # 属于什么类型
        'Topic :: Software Development :: Build Tools',

        # 许可证信息
        'License :: OSI Approved :: MIT License',

        # 目标 Python 版本
        'Programming Language :: Python :: 2',
        'Programming Language :: Python :: 2.7',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.3',
        'Programming Language :: Python :: 3.4',
        'Programming Language :: Python :: 3.5',
    ]
)

关于文件的分发

from setuptools import setup, find_packages


setup(
    name="mytest",
    version="1.0",
    author="wangbm",
    author_email="wongbingming@163.com",
    description="Learn to Pack Python Module",
    url="http://iswbm.com/", 
    packages=find_packages(),

    # 安装过程中,需要安装的静态文件,如配置文件、service文件、图片等
    data_files=[
        ('', ['conf/*.conf']),
        ('/usr/lib/systemd/system/', ['bin/*.service']),
               ],

    # 希望被打包的文件
    package_data={
        '':['*.txt'],
        'bandwidth_reporter':['*.txt']
               },
    # 不打包某些文件
    exclude_package_data={
        'bandwidth_reporter':['*.txt']
               }
)

除了以上的参数配置之外,还可以使用一个叫做 MANIFEST.in 的文件,来控制文件的分发。

如下这是一个 MANIFEST.in 的样例:

include *.txt
recursive-include examples *.txt *.py
prune examples/sample?/build

这些配置,规定了如下几点

  • 所有根目录下的以 txt 为后缀名的文件,都会分发

  • 根目录下的 examples 目录 和 txt、py文件都会分发

  • 路径匹配上 examples/sample?/build 不会分发

MANIFEST.in 需要放在和 setup.py 同级的顶级目录下,setuptools 会自动读取该文件。

关于依赖包下载安装

from setuptools import setup, find_packages


setup(
    ...

    # 表明当前模块依赖哪些包,若环境中没有,则会从pypi中下载安装
    install_requires=['docutils>=0.3'],

    # setup.py 本身要依赖的包,这通常是为一些setuptools的插件准备的配置
    # 这里列出的包,不会自动安装。
    setup_requires=['pbr'],

    # 仅在测试时需要使用的依赖,在正常发布的代码中是没有用的。
    # 在执行python setup.py test时,可以自动安装这三个库,确保测试的正常运行。
    tests_require=[
        'pytest>=3.3.1',
        'pytest-cov>=2.5.1',
    ],

    # 用于安装setup_requires或tests_require里的软件包
    # 这些信息会写入egg的 metadata 信息中
    dependency_links=[
        "http://example2.com/p/foobar-1.0.tar.gz",
    ],

    # install_requires 在安装模块时会自动安装依赖包
    # 而 extras_require 不会,这里仅表示该模块会依赖这些包
    # 但是这些包通常不会使用到,只有当你深度使用模块时,才会用到,这里需要你手动安装
    extras_require={
        'PDF':  ["ReportLab>=1.2""RXP"],
        'reST': ["docutils>=0.3"],
    }
)

关于 install_requires, 有以下五种常用的表示方法:

  1. 'argparse',只包含包名。这种形式只检查包的存在性,不检查版本。方便,但不利于控制风险。

  2. 'setuptools==38.2.4',指定版本。这种形式把风险降到了最低,确保了开发、测试与部署的版本一致,不会出现意外。缺点是不利于更新,每次更新都需要改动代码。

  3. 'docutils >= 0.3',这是比较常用的形式。当对某个库比较信任时,这种形式可以自动保持版本为最新。

  4. 'Django &gt;= 1.11, != 1.11.1, <= 2',这是比较复杂的形式。如这个例子,保证了Django的大版本在1.11和2之间,也即1.11.x;并且,排除了已知有问题的版本1.11.1(仅举例)。对于一些大型、复杂的库,这种形式是最合适的。

  5. 'requests[security, socks] >= 2.18.4',这是包含了额外的可选依赖的形式。正常安装requests会自动安装它的install_requires中指定的依赖,而不会安装securitysocks这两组依赖。这两组依赖是定义在它的extras_require中。这种形式,用在深度使用某些库时。

关于安装环境的限制

有些库并不是在所以的 Python 版本中都适用的,若一个库安装在一个未兼容的 Python 环境中,理论上不应该在使用时才报错,而应该在安装过程就使其失败,提示禁止安装。

这样的功能,可以使用 python_requires 来实现。

setup(
    ...
    python_requires='>=2.7, <=3',
)

生成可执行文件的分发

from setuptools import setup, find_packages


setup(
    name="mytest",
    version="1.0",
    author="wangbm",
    author_email="wongbingming@163.com",
    description="Learn to Pack Python Module",
    url="http://iswbm.com/", 
    packages=find_packages(),

    # 用来支持自动生成脚本,安装后会自动生成 /usr/bin/foo 的可执行文件
    # 该文件入口指向 foo/main.py 的main 函数
    entry_points={
        'console_scripts': [
            'foo = foo.main:main'
        ]
    },

    # 将 bin/foo.sh 和 bar.py 脚本,生成到系统 PATH中
    # 执行 python setup.py install 后
    # 会生成 如 /usr/bin/foo.sh 和 如 /usr/bin/bar.py
    scripts=['bin/foo.sh''bar.py']
)

上面的 scripts 里有的脚本中有 shpy 后缀,那么安装后,setuptools 会原封不动的移动到 /usr/bin 中,并添加可执行权限。

若你想对这些文件再作一些更改,比如去掉多余的后缀,可以这样做

from setuptools.command.install_scripts import install_scripts

class InstallScripts(install_scripts):

    def run(self):
        setuptools.command.install_scripts.install_scripts.run(self)

        # Rename some script files
        for script in self.get_outputs():
            if basename.endswith(".py"or basename.endswith(".sh"):
                dest = script[:-3]
            else:
                continue
            print("moving %s to %s" % (script, dest))
            shutil.move(script, dest)

setup(
    ...
    scripts=['bin/foo.sh''bar.py'],

    cmdclass={
        "install_scripts": InstallScripts
    }
)

ext_modules

ext_modules 参数用于构建 C 和 C++ 扩展扩展包。其是 Extension 实例的列表,每一个 Extension 实例描述了一个独立的扩展模块,扩展模块可以设置扩展包名,头文件、源文件、链接库及其路径、宏定义和编辑参数等。如:

setup(
    # other arguments here...
    ext_modules=[
        Extension('foo',
                  glob(path.join(here, 'src''*.c')),
                  libraries = [ 'rt' ],
                  include_dirs=[numpy.get_include()])
    ]
)

详细了解可参考:https://docs.python.org/3.6/distutils/setupscript.html#preprocessor-options

指定release

setup.py 里只能指定 version,而不能指定 release,如果你需要变更版本号,可以使用 --release 参数进行指定

python setup.py bdist_rpm --release=20200617

setup.py 的参数非常多,能够不借助文档写好一个setup.py好像没那么简单。为了备忘,我整理了 setup 函数常用的一些参数:

花了两天,终于把 Python 的 setup.py 给整明白了

更多参数可见:https://setuptools.readthedocs.io/en/latest/setuptools.html

8. 打包辅助神器PBR 是什么?

pbr 是 setuptools 的辅助工具,最初是为 OpenStack 开发(https://launchpad.net/pbr),基于d2to1

pbr 会读取和过滤setup.cfg中的数据,然后将解析后的数据提供给 setup.py 作为参数。包含如下功能:

  1. 从git中获取Version、AUTHORS and ChangeLog信息

  2. Sphinx Autodoc。pbr 会扫描project,找到所有模块,生成stub files

  3. Requirements。pbr会读取requirements.txt,生成setup函数需要的install_requires/tests_require/dependency_links

这里需要注意,在 requirements.txt 文件的头部可以使用:--index https://pypi.python.org/simple/,这一行把一个抽象的依赖声明如 requests==1.2.0 转变为一个具体的依赖声明 requests 1.2.0 from pypi.python.org/simple/

  1. long_description。从README.rst, README.txt or README file中生成long_description参数

使用pbr很简单:

from setuptools import setup

setup(
    setup_requires=['pbr'],
    pbr=True,
)

使用pbr时,setup.cfg中有一些配置。在[files]中,有三个key:
packages:指定需要包含的包,行为类似于setuptools.find_packages
namespace_packages:指定namespace packages
data_files: 指定目的目录和源文件路径,一个示例:

[files]
data_files =
    etc/pbr = etc/pbr/*
    etc/neutron =
        etc/api-paste.ini
        etc/dhcp-agent.ini
    etc/init.d = neutron.init

[entry_points] 段跟 setuptools 的方式相同。

到此,我讲了三种编写使用 setup.py 的方法

  • 使用命令行参数指定,一个一个将参数传递进去(极不推荐)

  • 在 setup.py 中的setup函数中指定(推荐使用)

  • 使用 pbr ,在 setup.cfg 中指定(易于管理,更推荐)

9. 如何使用 setup.py 构建包

1、构建源码发布包。

用于发布一个 Python 模块或项目,将源码打包成 tar.gz (用于 Linux 环境中)或者 zip 压缩包(用于 Windows 环境中)

$ python setup.py sdist

那这种包如何安装呢?

答案是,使用下一节即将介绍的 setuptools 中提供的 easy_install 工具。

$ easy_install xxx.tar.gz

使用 sdist 将根据当前平台创建默认格式的存档。在类 Unix 平台上,将创建后缀后为 .tar.gz  的 gzip 压缩的tar文件分发包,而在Windows上为 ZIP 文件。

当然,你也可以通过指定你要的发布包格式来打破这个默认行为

$ python setup.py sdist --formats=gztar,zip

你可以指定的格式有哪些呢?

创建一个压缩的tarball和一个zip文件。可用格式为:

花了两天,终于把 Python 的 setup.py 给整明白了

对以上的格式,有几点需要注意一下:

  • 在版本3.5中才添加了对  xztar 格式的支持

  • zip 格式需要你事先已安装相应的模块:zip程序或zipfile模块(已成为Python的标准库)

  • ztar 格式正在弃用,请尽量不要使用

另外,如果您希望归档文件的所有文件归root拥有,可以这样指定

python setup.py sdist --owner=root --group=root

2、构建二进制分发包。

在windows中我们习惯了双击 exe 进行软件的安装,Python 模块的安装也同样支持 打包成 exe 这样的二进制软件包。

$ python setup.py bdist_wininst

而在 Linux 中,大家也习惯了使用 rpm 来安装包,对此你可以使用这条命令实现 rpm 包的构建

$ python setup.py bdist_rpm

若你喜欢使用 easy_install 或者 pip 来安装离线包。你可以将其打包成 egg 包

$ python setup.py bdist_egg

若你的项目,需要安装多个平台下,既有 Windows 也有 Linux,按照上面的方法,多种格式我们要执行多次命令,为了方便,你可以一步到位,执行如下这条命令,即可生成多个格式的进制包

$ python setup.py bdist

10. 如何使用 setup.py 安装包

正常情况下,我们都是通过以上构建的源码包或者二进制包进行模块的安装。

但在编写 setup.py 的过程中,可能不能一步到位,需要多次调试,这时候如何测试自己写的 setup.py 文件是可用的呢?

这时候你可以使用这条命令,它会将你的模块安装至系统全局环境中

$ python setup.py install

如若你的项目还处于开发阶段,频繁的安装模块,也是一个麻烦事。

这时候你可以使用这条命令安装,该方法不会真正的安装包,而是在系统环境中创建一个软链接指向包实际所在目录。这边在修改包之后不用再安装就能生效,便于调试。

$ python setup.py develop

11. 如何发布包到 PyPi?

通过上面的学习,你一定已经学会了如何打包自己的项目,若你觉得自己开发的模块非常不错,想要 share 给其他人使用,你可以将其上传到 PyPi (Python Package Index)上,它是 Python 官方维护的第三方包仓库,用于统一存储和管理开发者发布的 Python 包。

如果要发布自己的包,需要先到 pypi 上注册账号。然后创建 ~/.pypirc 文件,此文件中配置 PyPI 访问地址和账号。如的.pypirc文件内容请根据自己的账号来修改。

典型的 .pypirc 文件

[distutils]
index-servers = pypi

[pypi]
username:xxx
password:xxx

然后使用这条命令进行信息注册,完成后,你可以在 PyPi 上看到项目信息。

$ python setup.py register

注册完了后,你还要上传源码包,别人才使用下载安装

$ python setup.py upload

或者也可以使用 twine 工具注册上传,它是一个专门用于与 pypi 进行交互的工具,详情可以参考官网:https://www.ctolib.com/twine.html,这里不详细讲了。

参考文章

  • http://blog.konghy.cn/2018/04/29/setup-dot-py/

  • https://note.qidong.name/2018/01/python-setup-requires/

– EOF –