我剛開始接觸爬蟲的時候,只是看完了 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,大家都不陌生。但是由於目前很多框架或者庫等...