无法访问子级中的父实例varibale

时间:2017-06-19 14:39:29

标签: python scrapy scrapy-spider

我正在研究scrapy框架。

我在所有蜘蛛中都有一些常见的属性,所以我制作了一个BaseSpider。

BaseSpider

import scrapy
from src.LoggerFactory import get_logger
import ConfigParser
from redis import Redis


class BaseSpider(scrapy.Spider):
    logger = get_logger()

    def __init__(self, *args, **kwargs):
        super(scrapy.Spider, self).__init__(*args, **kwargs)
        config = ConfigParser.RawConfigParser()
        config.read('../../config.cfg')
        self.config = config
        self.redis = Redis(host=config.get('redis', 'host'), port=config.get('redis', 'port'))

    def parse(self, response):
        pass

我的EbaySpider如下

EbaySpider

import scrapy
import json
from scrapper.items import Product
from BaseSpider import BaseSpider


class EbaySpider(BaseSpider):
    name = "ebay"
    allowed_domains = ["ebay.com"]

    def __init__(self, *args, **kwargs):
        super(BaseSpider, self).__init__(*args, **kwargs)
        print self.redis # Throws AttributeError: 'EbaySpider' object has no attribute 'redis'
        exit()

最奇怪的部分是我仍然可以访问scrapy.Spider中的EbaySpider属性,尽管它不是从scrapy.Spider继承的。

此外,如果有任何scrapy方式来扩展Spiders,请建议,因为我无法在他们的文档中找到它。

由于

1 个答案:

答案 0 :(得分:4)

您的super用法错误。

  

典型的超类调用如下所示:

class C(B):
    def method(self, arg):
        super(C, self).method(arg)

As per official 2.7 docs

你的样子在哪里:

class C(B):
    def method(self, arg):
        super(B, self).method(arg)
              ^