查看原文
其他

学Python还没搞清类和对象?或许你该进来看看

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:任   哲,中南财经政法大学经济学院

本文编辑:张孟晗

技术总编:陈   鼎

Stata&Python云端课程来啦!

       为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~爬虫俱乐部推出了Python编程培训课程Stata基础课程Stata进阶课程Stata文本分析正则表达式网络爬虫基本字符串课程。报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦。我们在这篇推文的最后提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~

引言
在文章的最开头,我想问大家一个问题:你是如何理解class的呢?

 

在学习Python后,大家想必都或多或少地遇见过class。大家对class的认识水平可能有高有低,但无论如何理解它,你最好不是只在下面这个场景里见过class


如果你和上图一样,只在查看变量类型时才见到过class。那么可以说明你没有明白一句话,就是从开始学习Python的时就一直萦绕在大家耳边的那句话:Python是一种面向对象的语言。很多人,尤其是像我们一样非专业从事编程的人,对这句话的理解简单的停留在:哦,有这么一句话,大家都说。等被追问到什么是面向对象、它到底有什么用时就说不上什么了。虽然说,即使不理解这句话,你的代码依旧可以写下去,你的程序依旧也可以运行;但等到你对Python的需求增加时,等你百度网上相关代码却发现动不动就是一个class时,你就会迫切的需要明白为什么Python是一种面向对象的语言。

一、Python是一种面向对象的语言
Python是一种面向对象的语言这句话可以用下面一张图形象的解释:


啊不,开个玩笑。此对象非彼对象,Python中的面向对象是指的一种与面向过程相对应的开发思想。所谓面向过程的开发思想就是当需要完成一个项目时,开发的重点是完成这个项目的步骤和过程。而面向对象的开发思想则并不在意步骤和过程,这种思想更看重的是什么事物能帮助我们完成项目。(你或许有疑问:那这个事物我们能将它称之为对象吗?先不着急回答这个问题,我们继续往下看。)
在提出抽象的定义之后,我们用网络上经典的洗衣服案例来解释面向过程面向对象
# 面向过程的洗衣服完成洗衣服的步骤如下:拿到衣服→放入盆中→加水和洗衣粉→浸泡→揉搓→...→拧干→洗完衣服
# 面向对象的洗衣服完成洗衣服的步骤如下:拿到衣服→找一个洗衣机→放入衣服、水、洗衣粉→启动→等待结束→洗完衣服
注:不要因为洗衣服的例子,就认为过程一定是线性的。


可以看到,在面向过程的洗衣服时,我们要详细的设计每一个环节,浸泡多久,如何揉搓,如何拧干这些设计我们都要亲力亲为,放入代码中,一开始可能并不困难,比如定义好浸泡函数,揉搓函数,拧干函数,并把这些函数放入到需要的地方就行了。可随着洗衣服的发展,也许今天是洗T恤衫,明天是毛衣,后天是羽绒服,又或者我们有的衣服能浸泡,而有的衣服要干洗,再后来你可能还要洗别人的衣服,需要的功能越来越多导致函数定义的越来越多,你终于忍无可忍造了一台洗衣机,此时你就完成了从面向过程洗衣服到面向对象洗衣服的改变。事实上,这就是面向对象这种开发思想被提出来的原因,在大型项目中对每个过程事无巨细的投入资源开发会导致代码的重复,现实的需求要求编程开发的方法论进行转变,在这种背景下,学界和业界足见形成了面向对象这种新的方法论,并迅速在全球流行。
回到之前的那个问题,这个能帮助我们完成项目的事物,也即例子中的洗衣机就是所谓的对象吗?答案是肯定的,但有一点你要明白,你家的洗衣机,小明家的洗衣机、商场里的一百台洗衣机都可以是对象,但是洗衣机这一类事务并不能称之为对象而应该称之为。也就是说,是工程师们为模拟某种事物而进行的一种抽象概括,而对象是一个的某个具体实例。面向对象的开发思想就是不在关注项目中的流程步骤,而是关注如何开发具有所需功能的,再让实例化的对象来完成项目。

二、如何创建一个类

上文说过,是工程师们为模拟某种事物而进行的一种抽象概括。那么既然是模拟某种事物,就要包含两个方面:是什么和能做什么?在创建时它们被叫做属性行为。接下来,我们进行一个简单的尝试,先暂时不进行任何属性和行为的设置:

你可以看到对象a的类型是<class '__main__.Club'>,在说明我们成功的创建了一个名为Club的类。你看到这里可能瞬间联想到了<class 'str'>,<class 'list'>这些东西,没错你心中隐隐约约所猜测的就是事实:所有变量的类型都是一种。那么在此基础上所有的变量都是某种的实例,也就是说所有变量都是对象。这就是Python一切皆对象这句话的由来。
紧接着,我们来对定义的属性。定义的属性的手段不止一种,本文只介绍最常用的手段。这里先科普一个知识点:在类中定义的函数被叫做方法。

在上例中,我们使用__init__()魔法函数来对类Club的名称name、和位置location两个属性进行了定位。有些人可能不知道什么是魔法函数,碍于篇幅本文不会详细展开,只对文中出现的魔法函数进行一定的讲解。首先,__init__()魔法函数的写法如下:
__init__(self, arg1, arg2,...)
该魔法函数中的init是单词初始化initialization的缩写,代表我们属性设置的初始化。self是一个必不可少的形式参数,它的作用就是代替实例,比如设对象a为类Club的实例,那self就代表a,对象b为类Club的实例,那self就代表b,后跟就是需要的属性参数,数量不固定。所以,self在创建对象实例时不必在括号中填写,括号里只需填写属性对应的参数。
但如果,我们想添加一些属性,这些属性可能是你遗忘的,也可能是不常用的,该怎么办呢?可以采用对象.属性 = 属性值的手段添加。如下:

说完了属性,我们来讲如何定义类的行为,也即类能干什么。其实很简单,就是在类中定义函数即可(我们改称这类函数为方法),调用时通过对象.方法进行调用。我们给类Club定义一个介绍introduce的功能,如下所示:


三、类的继承
讲完了类的创建,我们来说一些类的继承。所谓类的继承就是一个类可以继承另一个类的全部内容,被继承的类叫做父类,继承的类叫做子类。继承的方法如下:
class 子类名称(父类名称):# 父类可以不唯一
如果我们括号里不写父类名称,那么则视为继承object类,object类是所有类的父类,但是我们不必详细了解它。 
类的继承也有不同类型,具体见下表:

1.在子类中调用或重写父类的方法
类的继承就是一个类继承另一个类的全部属性和方法,那么如何调用父类中的方法呢?很简答只要通过子类.父类方法的手段就可以了,下面是一个多层继承的案例:

但是,如果出现子类中的方法与父类中重名的情况,Python会默认使用子类的方法。事实上这也叫子类方法的重写,一般用于父类同名的方法无法满足使用需求时。当然,在重名的情况下你也可以通过super(目标类的子类, self).方法的手段继续调用父类方法,说起来比较拗口,其实就是如果类B继承类A,想使用类A的方法时就在super()里写类B。例子如下:

2.多继承中调用指定父类的方法
在多继承之中,如果子类和父类的方法没有重名,那就直接调用父类方法即可。如果子类和父类的方法重名,仍然是优先使用子类的方法,但是此时如果想使用指定父类的方法就不像多层继承那么。简单了,此时多了一个步骤即,观察继承顺序链。假设类C同时继承了类A和类B(先A后B),观察继承顺序链的方法是打印类名.__mro__。结果如下:
print(C.__mro__)
<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>
从左往右是类C使用方法时的调用顺序,此时使用super()来调用目标类方法是括号内需填入目标类左侧的类,如本例中想要使用类B的方法,就在super()里填入A即可。展示如下:

好了,以上就是今天的全部内容。碍于篇幅,本文并没有完整的讲述的全部内容,只是提及了一些重点、常用知识点。本文没有举出用于复杂功能的例子,但这并不代表不能创建出拥有超强功能的,具体还要大家自己多进行钻研。Python是一种面向对象的语言,面向对象编程才是Python的精髓,尽管Python也能实现面向过程开发,但你应该不想学了Pyhton之后写出的代码一点儿也不Python。所以,赶紧试试面向对象的编程,敲出属于你的对象吧!
最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。



腾讯课堂课程二维码








                


 对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!





往期推文推荐

        Stata中的判断神器——confirm命令

         cngdf——名义GDP与实际GDP之间的摆渡船

最近《扫黑风暴》有点火爆!我从豆瓣评论中发现了这些……

随机森林-Random Forest 

复原之神--preserve&restore

         合并,“纵”享新丝滑:frameappend & xframeappend
什么是全局配置项?|从零开始的Pyecharts(二)帮你拿下数据可视化|从零开始的Pyecharts 

Stata助力疫情打卡管理——是谁没有接龙呢?

这十年,《金融研究》的编委和读者偏爱哪些研究话题和文章?

【案例展示】Python与数据库交互

学好这一手,英语词典常在手 

玩转Stata中的数学函数

用spmap看中国空气质量

戳穿围城面具:安利&劝退一个专业

走进图文并茂的攻略世界 

玩转word文档“大变身”——wordconvert

数据读入|一文读懂用Stata读入不同类型的数据

简述递归

OpenCV库——轻松更换证件照背景色

800万年薪!还有谁?!

千古伤心词人,词伤几何?

去哪儿网攻略爬取——跟我一起去大理吧

"有你才有团"——Stata爬取王者荣耀英雄海报

爬虫实战|嚣张的徽州宴老板娘错在哪?

如何获取衡量股民情绪的指标?|东方财富股吧标题爬虫

利用Python构建马科维茨有效边界

rangestat,让统计量灵活滚动起来!

听说这样做立项成功率更高哦

如何处理缺失值?这一篇搞定!

善用dataex命令,高效沟通你我他

用Markdown制作简历,强力助力你的求职季

关于我们 


微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里

作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
中提出,只需支付少量赏金,我们会在后期的推文里给予解答。




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存