Python 什么触发from_crawler类方法?

Python 什么触发from_crawler类方法?,python,scrapy,Python,Scrapy,我正在使用scrapy,我有以下功能管道类: 类DynamicSQLlitePipeline(对象): 在我的蜘蛛中,我有: custom_settings = { 'ITEM_PIPELINES': { 'myproject.pipelines.DynamicSQLlitePipeline': 600, } } 最近有人向我提出了一个问题 如果我理解正确,为了实例化管道对象(使用init函数),它需要一个摘要编号。只有在运行from_crawler类方法后,

我正在使用scrapy,我有以下功能管道类:

类DynamicSQLlitePipeline(对象):

在我的蜘蛛中,我有:

custom_settings = {
    'ITEM_PIPELINES': {

        'myproject.pipelines.DynamicSQLlitePipeline': 600,
    }
}
最近有人向我提出了一个问题


如果我理解正确,为了实例化管道对象(使用init函数),它需要一个摘要编号。只有在运行from_crawler类方法后,卷宗号才可用。但是什么触发了from_crawler方法呢。代码再次正常工作。

类方法的调用方必须具有该类的实例。他们可能只是通过名称访问它,如下所示:

DynamicSQLlitePipeline.from_crawler(crawler)
pipelines[i].from_crawler(crawler)
ITEM_PIPELINES = {
    'myproject.pipelines.PricePipeline': 300,
    'myproject.pipelines.JsonWriterPipeline': 800,
}
…或:

sqlitepipeline.DynamicSQLlitePipeline.from_crawler(crawler)
或者,您将类对象传递给某人,他们将其存储并在以后使用,如下所示:

DynamicSQLlitePipeline.from_crawler(crawler)
pipelines[i].from_crawler(crawler)
ITEM_PIPELINES = {
    'myproject.pipelines.PricePipeline': 300,
    'myproject.pipelines.JsonWriterPipeline': 800,
}
在Scrapy中,根据,向框架注册一组管道的常用方法如下:

DynamicSQLlitePipeline.from_crawler(crawler)
pipelines[i].from_crawler(crawler)
ITEM_PIPELINES = {
    'myproject.pipelines.PricePipeline': 300,
    'myproject.pipelines.JsonWriterPipeline': 800,
}
(另请参见,其中解释了如何将其应用到一个粗糙的项目中。)


大概您在没有向我们展示的代码中做了类似的事情,在该dict中添加了类似于
'sqlscraper.pipelines.dynamicsqllitepippeline'
的内容。在某个时候,Scrapy会遍历该dict,按值对其排序,并实例化每个管道。(因为它以字符串的形式包含类的名称,而不是类对象,这有点复杂,但这里的细节并不相关。)

new\u pipeline=dynamicsqllitepippeline.from\u crawler(crawler)
您没有向我们展示的其他一些代码正在通过执行类似于
DynamicSQLlitePipeline.from_crawler(crawler)
的操作来调用它。或者,您可能正在将名称
dynamicsqllitepippeline
传递到爬虫程序中,它将其存储为
pipeline\u-type
,然后调用
pipeline\u-type。从爬虫程序(爬虫程序)
@abarnert添加了整个管道类。它不在管道类中。实际的调用代码在Scrapy中,但是您需要一些代码来告诉它要构造哪些类以及连接它们的顺序,这就是您没有向我们展示的代码。我写了一个答案,试图用一般的术语来解释发生了什么,但如果你给我们一个简单的答案,你会更容易理解。@user61629酷。我确信有一个地方可以解释这一点,而不仅仅是提供参考,但我不确定它在哪里。所以我把你的发现编辑成了答案。谢谢你找到它。谢谢你,我还发现以下内容很有帮助。对于scrapy api入口点,我不是100%理解,但我假设from_crawler类方法在实例化每个exstension(包括管道)之前由scrapy调用@user61629 scrapy的大部分内容都没有那么复杂,因此如果您想了解它的更多功能,您可以随时阅读。如果你搜索
项目管道
,应该很容易找到。