### 1、问题

我刚开始接触爬虫的时候,只是看完了 python 的基础,对 python 的语法还没有一个很深入的了解,在使用 bs4 这个库的时候,对其中某些语法感到非常的惊奇,不明白是怎么实现的。

bs4 的官方文档中说到:`find_all()` 几乎是 Beautiful Soup 中最常用的搜索方法,所以我们定义了它的简写方法。`BeautifulSoup` 对象和 `tag` 对象可以被当作一个方法来使用,这个方法的执行结果与调用这个对象的 `find_all()` 方法相同,下面两行代码是等价的:

```

soup.find_all("a")

soup("a")

```

这里,`soup` 是一个 `BeautifulSoup` 对象,`soup("a")` 这很明显是把对象当方法使用了,这是怎么做到的呢?

### 2、实现

在 Python 中,除了用户定义的函数,调用运算符(即 ())还可以应用到其他对象上。内置的 `callable()` 函数用来判断一个对象能否调用。就是说,任何 Python 对象都可以表现得像函数一样,为此,只需实现实例方法 `__call__`。

来看一个简单的示例:

```

class Sum:

def __init__(self, x, y):

self._x = x

self._y = y

def add(self):

return self._x + self._y

def __call__(self):

return self.add()

sum = Sum(1, 2)

print(sum.add())

print(sum())

print(callable(sum))

```

**输出:**

```

3

3

True

```

这样就明白了,bs4 中亦是如此,源码如下:

```

class Tag(PageElement):

def __call__(self, *args, **kwargs):

return self.find_all(*args, **kwargs)

```

这背后涉及到的概念叫做**可调用对象**,Python 数据模型文档列出了 7 种可调用对象。

- **用户定义的函数**:使用 def 语句或 lambda 表达式创建。

- **内置函数**:使用 C 语言(CPython)实现的函数,如 len 或 time.strftime。

- **内置方法**:使用 C 语言实现的方法,如 dict.get。

- **方法**:在类的定义体中定义的函数。

- **类**:调用类时会运行类的 `__new__` 方法创建一个实例,然后运行 `__init__` 方法,初始化实例,最后把实例返回给调用方。因为 Python 没有 `new` 运算符,所以调用类相当于调用函数。(通常,调用类会创建那个类的实例,不过覆盖 `__new__` 方法的话,也可能出现其他行为。)

- **类的实例**:如果类定义了 `__call__` 方法,那么它的实例可以作为函数调用。

- **生成器函数**:使用 yield 关键字的函数或方法。调用生成器函数返回的是生成器对象。

> 转自 https://juejin.im/post/5cc2a673f265da03b2043673

怎样用计算机算出54188,对象也可以当方法用?相关推荐

  1. 怎样用计算机算出圆周率,古代没有计算机的时代 祖冲之是如何算出圆周率的...

    原标题:古代没有计算机的时代 祖冲之是如何算出圆周率的 今天趣历史小编就给大家带来祖冲之的文章,希望能对大家有所帮助. 祖冲之,提起这个名字大家首先想到的就是圆周率,因为,圆周率是祖冲之的代表性成果. ...

  2. 如何用计算机算出男朋友的身高,【趣味物理】如何用物理方法测出男生的真实身高?...

    原标题:[趣味物理]如何用物理方法测出男生的真实身高? 毕导,本名毕啸天,清华大学化工系博士生,今日头条优质科普内容创作者. 如何测出男生的真实身高? 男生常常会隐瞒身高,173敢报178,175就敢 ...

  3. 用计算机算出90除以6.28,谁能帮忙出300道二年级下期的数学竖式题

    谁能帮忙出300道二年级下期的数学竖式题 谁能帮忙出300道二年级下期的数学竖式题 人气:936 ℃时间:2019-12-08 09:45:28 优质解答 25 -15 -80 = 10 -80 = ...

  4. 什么用计算机算出自己在世界上活.了几天,据说科学家发现了一个“寿命计算器”,来算一下自己能活多久?...

    原标题:据说科学家发现了一个"寿命计算器",来算一下自己能活多久? 为什么有的人能活到100岁? 为什么有的人却早早离世? 到底是什么影响着我们的寿命? 据生命时报,美国坦普尔大学 ...

  5. 用计算机算出女神的生日,Excel中通过出生日期智能计算年龄或虚岁 | 我爱分享网...

    在 Excel里计算年龄可是很常见的一项工作,你会吗?接下来就给大家分享一下怎么通过出生日期计算出女神的真实年龄.虚岁! 方法/技巧: 1.自动算周岁 这是最简单的,只要知道今天的日期和出生日期,Ex ...

  6. 用计算机算出自己鞋码和年龄,魔力科学小实验,用鞋码数就能算出你的年龄,这个算式就这么厉害?...

    原标题:魔力科学小实验,用鞋码数就能算出你的年龄,这个算式就这么厉害? 每天1个科学小知识,培养孩子的科学素养. 文|魔力科学小实验,本文为原创,欢迎关注及转载分享.  最近有道非常火的数学题,说是 ...

  7. 怎么用计算机算出年龄鞋码,一种预测鞋码的方法、装置和系统以及计算机可读存储介质与流程...

    本发明涉及一种预测鞋码的方法.装置和系统以及计算机可读存储介质,更具体而言,涉及一种利用多维变量的预测鞋码的方法.装置和系统以及计算机可读存储介质. 背景技术: 现今在网上购买衣服及其他物品已是非常之 ...

  8. 用计算机算出90除以6.28,用计算器计算:sin51°30′+ cos49°50′-tan46°10′的值是 .——青夏教育精英家教网——...

    题目所在试卷参考答案: 参考答案 一.基础.巩固达标 1.在Rt△ABC中,如果各边长度都扩大2倍,则锐角A的正弦值和余弦值( ) A.都没有变化 B.都扩大2倍 C.都缩小2倍 D.不能确定 思路解 ...

  9. 怎么用计算机算出出生日期,算农历出生日期计算器,根据出生日期怎么算年龄?...

    提起算农历出生日期计算器,大家都知道,有人问根据阴历日期和出生时间算阳历,另外,还有人想问农历虚岁计算器 农历虚岁怎么算,你知道这是怎么回事?其实农历生日如何算,下面就一起来看看根据出生日期怎么算年龄 ...

  10. 四年级用计算机算出本月合计,四年级数学下册简算练习题及答案

    四年级数学下册简算练习题及答案 导语:学问是异常珍贵的东西,从任何源泉吸收都不可耻.下面是小编为大家整理的,数学知识,更多相关信息请关CNFLA学习网! 一.知识万花筒. 1.特快列车1小时大约行16 ...

最新文章

  1. PyTorch 重磅更新,不只是支持 Windows
  2. repo 修改邮箱地址
  3. 修改开发环境、工程、文件的字符集
  4. 悟懂MapReduce,不纠结!
  5. JavaScript 断点调试技巧
  6. 复数抽象数据类型C语言,采用C/C++语言如何实现复数抽象数据类型Complex
  7. Thread.yield()
  8. jcmd jmap应用:一个String经典笔试题的验证
  9. CMake,win10,64位,简单配置测试
  10. R语言生信作图代码集合大全
  11. FIFO、LRU、LFU的含义和原理(转)
  12. 边缘计算与嵌入式系统
  13. HTML5表单技术 调查问卷设计
  14. 分享一个支持离线下载的免费网盘
  15. char *c和char c[]区别
  16. 在 MySQL 数据库中删除重复记录的步骤
  17. 填数字游戏ABCD*E=DCBA
  18. oracle锁矩阵,你有多了解Oracle Enqueue lock队列锁机制?
  19. JAVA自我总结和分享—JVM
  20. 第15节--神经网络应用--异或判断、手写数字识别

热门文章

  1. Win10 快捷操作
  2. 智能药盒 树莓派与Arduino实现药板自助取药
  3. 用 Python 进行 OCR 图像识别
  4. 漫画:为什么不能打断程序员?
  5. VSCode好用的插件
  6. 【Testin云测活动】邀请好友使用Testin云测,得iPhone6!
  7. instead of触发器
  8. easyui datebox控件点击今天按钮不触发onSelect事件的解决方法
  9. vCenter资源池
  10. 小米路由器3无线网连接到服务器,小米路由器3无线中继(桥接)怎么设置?