2017-12-23 27 views
0

私はscrapyで作業しています。私はで始まるクモがあります。AttributeError: 'Spider'オブジェクトに 'table'という属性がありません

class For_Spider(Spider): 

    name = "for" 
# table = 'hello' # creating dummy attribute. will be overwritten 

    def start_requests(self): 

     self.table = self.dC# dc is passed in 

をI次のパイプラインがあります。

class DynamicSQLlitePipeline(object): 

    @classmethod 
    def from_crawler(cls, crawler): 
     # Here, you get whatever value was passed through the "table" parameter 
     table = getattr(crawler.spider, "table") 
     return cls(table) 

    def __init__(self,table): 
     try: 
      db_path = "sqlite:///"+settings.SETTINGS_PATH+"\\data.db" 
      db = dataset.connect(db_path) 
      table_name = table[0:3] # FIRST 3 LETTERS 
      self.my_table = db[table_name] 

は、私はクモを開始します。

scrapy crawl for -a dc=input_string -a records=1 

を私が取得:

AttributeError: 'For_Spider' object has no attribute 'table' 

「表」のコメントを外すと、プログラムは始める。私はなぜ 'テーブル'が動作するのか混乱していますが、self.tableは動作しません。誰かがこれを説明できますか?

答えて

1

tableは、クラス属性がFor_Spiderであり、self.tableが機能範囲内にあるため動作します。 selfはインスタンス自体を示しています。その場合、関数内では使用する必要はありません(__init__で定義しない限り)。
関数スコープ外にself.tableを定義しようとすると、エラーが発生します。

また、それらの属性を見るために両方のクラスに__dict__を使用して試してみて、テーブルで
を機能には次のようにコメントし

{'doc': None, 'start_requests': , 'name': 'for', 'module': 'builtins'})

あなたが見ることができるように、テーブルとはtable属性

はコメントしません:

{'doc': None, 'start_requests': , 'table': 'hello', 'name': 'for', 'module': 'builtins'})

私はそれがはっきりしたことを望みます:>

+0

ありがとうございます。私はクラス属性とインスタンス属性について混乱していると思います。私は彼らが本質的に同じだと思った。 – user61629

+0

また、実際には、パイプラインにアクセス可能なテーブル変数を動的に設定するために、コマンドラインから 'table'パラメータを渡したいと思います。 – user61629

関連する問題