2017-05-21 33 views
0

のようなクラスをインスタンス化する際に、私はエラーを取得していますかかります問題を引き起こしている可能性があります。 私のようなクラスを呼び出す:抽象基底クラス(ABC)を与えるエラー(__ __new)は、正確に4つの引数(2は、与えられた)

from crawler.GoogleCrawler import GoogleCrawler 

if __name__ == '__main__': 
    #w = GoogleCrawler(search_key='PKK') 
    GoogleCrawler('foods') 

ここではコードです:

BaseCrawler.py

class BaseCrawler(ABCMeta): 
    def __init__(self, search_key='', **kwargs): 

     if type(search_key) == str: 
      if search_key == '': 
       search_key = 'Kabe' 
      self.g_search_key_list = [search_key] 


     code continues ... 

GoogleCrawler.pyは、あなたは、Python 2.xでは

from BaseCrawler import BaseCrawler 

class GoogleCrawler(BaseCrawler): 

    def __init__(self, search_key='', **kwargs): 
     super().__init__(search_key, **kwargs) 

     # google search specific url parameters 
     self.search_url_prefix = kwargs.get('search_url_prefix', 'https://www.google.com.sg/search?q=') 
     self.search_url_postfix = kwargs.get('search_url_postfix','&source=lnms&tbm=isch&sa=X&ei=0eZEVbj3IJG5uATalICQAQ&ved=0CAcQ_AUoAQ&biw=939&bih=591') 

     # show more options 
     # options : 'id','class' 
     self.show_more_find_type = kwargs.get('show_more_find_type', 'id') 
     self.show_more_find_value = kwargs.get('show_more_find_value', 'smb') 


     code continues ... 
+1

'class BaseCrawler(ABCMeta):'は、メタクラスとして使用するのではなく、 'ABCMeta'から継承しています。 – user2357112

+0

クラスBaseCrawler(metaclass = ABCMeta)を使用している場合:その構文は無効です、推奨事項はありますか? –

+0

あなたはどのバージョンのPythonを使用していますか?なぜ、抽象基本クラスを最初に使用しようとしているのですか? –

答えて

2

は(2が必要とされていましたこの場合)。

from abc import ABCMeta 

class BaseCrawler(object): # CHANGED BASE CLASS 
    __metaclass__ = ABCMeta # ADDED 

    def __init__(self, search_key='', **kwargs): 
     if type(search_key) == str: 
      if search_key == '': 
       search_key = 'Kabe' 
      self.g_search_key_list = [search_key] 

class GoogleCrawler(BaseCrawler): 
    def __init__(self, search_key='', **kwargs): 
     # FOLLOWING LINE CHANGED TO SUPPLY NEEDED ARGS TO super() 
     super(GoogleCrawler, self).__init__(search_key, **kwargs) 

     # google search specific url parameters 
     self.search_url_prefix = kwargs.get('search_url_prefix', 'https://www.google.com.sg/search?q=') 
     self.search_url_postfix = kwargs.get('search_url_postfix','&source=lnms&tbm=isch&sa=X&ei=0eZEVbj3IJG5uATalICQAQ&ved=0CAcQ_AUoAQ&biw=939&bih=591') 

     # show more options 
     # options : 'id','class' 
     self.show_more_find_type = kwargs.get('show_more_find_type', 'id') 
     self.show_more_find_value = kwargs.get('show_more_find_value', 'smb') 

if __name__ == '__main__': 
    GoogleCrawler('foods') 
+0

こんにちは、super()についてのご理解ありがとうございます。それは役に立ちました。 –

3

が含まれていますが、クラスの特別な属性としてメタクラスを指定する必要があります。ダニエル・ローズマンは、あなたもPythonの2に、それは常に、少なくとも一つの引数を必要とするため、GoogleCrawlersuper()に引数に電話を追加する必要があります(__metaclass__ = ABCMetaBaseCrawlerに追加すること)を示唆するものに加えて

class BaseCrawler(object): 
    __metaclass__ = ABCMeta 
+0

私はあなたをupvoted!返信に時間をとってくれてありがとう。 –

関連する問題