刨根問底 物件也可以當方法用?

2021-09-19 18:58:26 字數 1352 閱讀 2507

我剛開始接觸爬蟲的時候,只是看完了 python 的基礎,對 python 的語法還沒有乙個很深入的了解,在使用 bs4 這個庫的時候,對其中某些語法感到非常的驚奇,不明白是怎麼實現的。

bs4 的官方文件中說到:find_all()幾乎是 beautiful soup 中最常用的搜尋方法,所以我們定義了它的簡寫方法。beautifulsoup物件和tag物件可以被當作乙個方法來使用,這個方法的執行結果與呼叫這個物件的find_all()方法相同,下面兩行**是等價的:

soup.find_all("a")

soup("a")

這裡,soup是乙個beautifulsoup物件,soup("a")這很明顯是把物件當方法使用了,這是怎麼做到的呢?

在 python 中,除了使用者定義的函式,呼叫運算子(即 ())還可以應用到其他物件上。內建的callable()函式用來判斷乙個物件能否呼叫。就是說,任何 python 物件都可以表現得像函式一樣,為此,只需實現例項方法__call__

來看乙個簡單的示例:

class

sum:

def__init__

(self, x, y)

: self._x = x

self._y = y

defadd(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

3true

這樣就明白了,bs4 中亦是如此,原始碼如下:

class tag(pageelement):

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

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

這背後涉及到的概念叫做可呼叫物件,python 資料模型文件列出了 7 種可呼叫物件。

刨根問底ioremap (一)

硬是在動態對映或者靜態對映後,只能讀不能寫,逼著我對ioremap刨根問底 1 arch alpha include asm io.h static inline void iomem ioremap unsigned long port,unsigned long size 尋找io concat...

刨根問底ajax原理與封裝

說起ajax,大家都不陌生。但是由於目前很多框架或者庫等都對網路請求做了封裝,導致了很多初學者只知其然而不知其所以然。所以今天我們就詳細了解一下ajax的實現原理和封裝ajax的關鍵步驟。ajax的核心是xmlhttprequest物件。首先我們先建立乙個xmlhttprequest物件var xh...

刨根問底ajax原理與封裝

摘要 說起ajax,大家都不陌生。但是由於目前很多框架或者庫等都對網路請求做了封裝,導致了很多初學者只知其然而不知其所以然。所以今天我們就詳細了解一下ajax的實現原理和封裝ajax的關鍵步驟。ajax的核心是xmlhttprequest物件。說起ajax,大家都不陌生。但是由於目前很多框架或者庫等...