一个给出错误的抽象基类(abc)正好接受4个参数(给定2个)

2024-09-27 23:27:55 发布

您现在位置:Python中文网/ 问答频道 /正文

实例化类时遇到错误:

GoogleCrawler('foods')
TypeError: __new__() takes exactly 4 arguments (2 given)
Process terminated with an exit code of 1

我正在使用一个抽象类(abc),它可能会产生问题。 我称这个班为:

^{pr2}$

代码如下:

在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包含

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 ...

Tags: keyselfurlsearchgetinitmoretype
2条回答

除了Daniel Roseman建议的(将__metaclass__ = ABCMeta添加到BaseCrawler)之外,还需要在GoogleCrawler中添加对super()的调用的参数,因为在python2中,它总是需要至少一个参数(本例中需要两个)。在

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

对于python2.x,您需要将元类指定为类的一个特殊属性。

class BaseCrawler(object):
    __metaclass__ = ABCMeta

相关问题 更多 >

    热门问题