如何在参数中使用关键词“self”的Python函数

23

我有一个Python函数,用于检索商店列表,该函数名为:

class LeclercScraper(BaseScraper):
    """
        This class allows scraping of Leclerc Drive website. It is the entry point for dataretrieval.
    """
    def __init__(self):
        LeclercDatabaseHelper = LeclercParser
        super(LeclercScraper, self).__init__('http://www.leclercdrive.fr/', LeclercCrawler, LeclercParser, LeclercDatabaseHelper)


    def get_list_stores(self, code):
        """
            This method gets a list of stores given an area code

            Input :
                - code (string): from '01' to '95'
            Output :
                - stores :
                    [{
                        'name': '...',
                        'url'
                    }]

        """

当我尝试写get_list_stores(92)时,我遇到了这个错误:

get_list_stores(92)
TypeError: get_list_stores() takes exactly 2 arguments (1 given)

你怎么能帮我处理这个问题?


1
尝试使用 self.get_list_stores(92)。这就像 Java 中的 this 关键字。 - inspectorG4dget
2
这个函数在类定义中吗?它应该在类定义中,但是如果它在类定义中,除非有一个NameError,否则你几乎找不到可以调用get_list_stores(92)的上下文。 - user2357112
4
self不是一个关键字。 - Jiminion
是的,就像Jim所说,self不是一个关键字。它可以取任何你想要的名字。self只是一种约定。 - Gustavo Barbosa
看起来它需要一个字符串,而你正在传递一个整数。这也可能是个问题,对吧? - Jiminion
3个回答

42

如果函数是在类(方法)中,应该像这样编写:

def get_list_stores(self, code):

你必须通过该类的实例来调用它:

ls = LeclercScraper()
ls.get_list_stores(92)

如果它不在类中,就不需要写 self 参数:

def get_list_stores(code):

现在它可以被称为普通函数(请注意,我们不是在实例上调用函数,它不再是一个方法):

get_list_stores(92)

5

您不应过度使用“self” - 建议将“self”作为类方法中编写的函数的第一个参数。在这种情况下,当它被调用为方法时,比如

class A(object):
    def get_list_stores(self,  code):
        ...

a = A()
a.get_listscores(92)

Python 会在调用时自动插入 "self" 参数 (并且它将是外部作用域中命名为 "a" 的对象)。
在类定义之外,命名第一个参数为 "self" 没有太多意义——虽然它不是关键字,但本质上也不是错误。
在你的情况下,很可能你要调用的函数是在类中定义的:你必须将其作为类实例的属性来调用,然后简单地省略第一个参数——就像上面的示例一样。

4
如果你想在类中使用它,可以按照以下方式访问:
self.get_listscores(92)

如果你想在课堂外访问它,你需要首先创建一个 LeclercScraper 的实例:

x = LeclercScraper()
y = x.get_listscores(92)

此外,self并不是一个关键字。它只是一种惯例所选择的名称,用于在类实例内部表示自身。
以下是一个很好的参考资料: self的目的是什么?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接