从函数 def 到类 Class

摘要:初学 Python 过程中,我们可能习惯了使用函数(def),在开始学习类(Class)的用法时,可能会觉得它的写法别扭,类的代码写法也不像函数那么简单直接,也会产生「有了函数为什么还需要类」的疑问。然而面向对象编程是 Python 最重要的思想,类(Class)又是面向对象最重要的概念之一,所以要想精通 Python ,则必须得会使用类(Class)来编写代码,而且 Pyspider 和 Scrapy 两大框架都使用了类的写法,基于此,本文将介绍如何从函数的写法顺利过渡到类的编写习惯。

关于类(Class)的教程,网上主要有两类,一类是廖雪峰大佬的,另一类是不加说明默认你已经会这种写法,而直接使用的。

廖雪峰的教程非常棒,但是更适合入门 Python 有一段时间或者看过一些更基础的教程之后再回过头来看,否则可能会觉得他的教程理论性重于实用性。我第一次看了他的教程中关于类的相关知识后,觉得理解了,但一尝试自己写时就不太会了。

第二类教程,网上有很多案例,这类教程存在的问题就是,你能看懂意思,但还是不太会运用到自己的代码中。

总结一下这两类教程对新手不友好的地方就是没有同时给出两种写法的实例对比,而「对比学习」是一种学习新知识非常快的途径,简单来说就是学新知识的时候,先从我们已经掌握的知识出发,和新知识进行对比,快速找到共同点和不同点,共同点我们能很快掌握,针对不同点通过对比去感悟领会,从而快速学会新知识。

接下来,就举几个同时使用了函数写法和类的写法的案例,希望能够帮助你快速完成从函数到类的编程思想的过渡转换。

▌爬取豆瓣电影 TOP250

第一个案例是爬取豆瓣电影 TOP250,我们实现的目标就是通过调用豆瓣 API 接口,获取电影名称、评分、演员等信息,然后存储到 CSV 文件中,部分代码如下:

打开 CSV 文件查看输出的结果:

以上,我们通过四个函数就完成了数据的爬取和存储,逻辑很清晰,下面我们使用类的写法实现同样的功能,部分代码如下:

可以看到,上面的案例中,类的写法和函数的写法大部分都是一样的,仅少数部分存在差异。主要有这么几点差异:

增加了一个函数。

这是一个特殊的函数,它的作用主要是事先把一些重要的属性填写进来,它的特点是第一个参数永远是,表示创建的实例本身,这里的实例就是最下面的(实例通过类名+() 创建)。

类中的函数和普通的函数相比,只有一点不同。

类中的函数(也称为方法)的第一个参数永远是实例变量,并且调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别。

在执行类的时候需要先实例化

这里我们定义了一个类,类名是 Douban(首字母要大写),在运行类的时候,需要先实例化,这里实例化为,然后调用 get_douban()方法完成数据的爬取和存储。

下面,我们再来看看第二个例子。

▌模拟登陆 IT 桔子

我们的目标是使用 Selenium 模拟登陆 IT 桔子网并输出网页源码,函数写法的部分代码如下:

以上代码实现了自动输入账号密码然后进入 IT 桔子网,下面我们再来看看类的写法:

这里,我们将一些固定的参数,比如 URL、Headers 都放在 方法中,需要的时候在各个函数中进行调用,这样的写法逻辑更加清晰。

下面,我们再看看第三个例子,从普通类的写法过渡到 pyspider 框架中类的写法,这样有助于快速上手 pyspider 框架。

▌爬取虎嗅文章

我们目标是通过分析 AJAX 请求,遍历爬取虎嗅网的文章信息,先来看看普通类的写法,部分代码如下:

然后再看看在 Pyspider 中的写法:

可以看到,pyspider 中主体部分和普通类的写法差不多,不同的地方在于 pyspider 中有一些固定的语法,这可以通过参考 pyspider 教程快速掌握。

通过以上三个例子的对比,我们可以感受到函数(def)、 类(Class)和 pyspider 三种代码写法的异同点,采取这样对比式的学习能够快速掌握新的知识。

如需完整代码,可以加入我的「知识星球:第2脑袋」获取,里面有很多干货,期待你的到来。

本文完。

(欢迎点赞、评论和分享,利他最终一定利己.)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181207G06KNL00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券