2017-06-19 5 views
0

Je travaille sur un framework scrapy.Impossible d'accéder à l'instance parent varibale dans l'enfant

J'ai quelques propriétés communes que je veux dans toutes mes araignées ainsi j'ai fait un 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 

Et mon EbaySpider est la suivante

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

Strangest partie est que je peux encore accéder scrapy.Spider properts dans mon EbaySpider bien qu'il ne soit pas hérité de scrapy.Spider.

De plus, s'il y a un moyen peu astucieux d'étendre les araignées, suggérez-moi de ne pas trouver cela dans leurs documentations.

Merci

Répondre

4

Votre utilisation super est faux.

un appel superclasse typique ressemble à ceci:

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

As per official 2.7 docs

Où est votre ressemble:

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

Oh mon mauvais! nouveau en python lol .. Merci mon frère –