类方法中的Python关键字参数

3

我想写一个类方法,它接受3个关键字参数。我以前使用过关键字参数,但好像在我的类内部无法使用。以下是代码:

def gamesplayed(self, team = None, startyear = self._firstseason,
                endyear = self._lastseason):

    totalGames = 0

    for i in self._seasons:
        if((i.getTeam() == team or team == "null") and
           i.getYear() >= startyear and i.getYear() <= endyear):

            totalGames += i .getGames()

    return totalGames

产生错误:

NameError: name 'self' is not defined

如果我去掉关键字参数,将它们变为简单的位置参数,它就可以正常工作。因此,我不确定我的问题出在哪里。感谢您提前的帮助。

2个回答

8
def gamesplayed(self, team = None, startyear = self._firstseason, endyear = self._lastseason):

在函数声明中,您试图使用self引用实例变量。然而,这是不起作用的,因为self只是函数的第一个参数的变量名,它传递了对当前实例的引用。因此,self特别不是一个关键字,它总是指向当前实例(与其他语言中的this不同)。这也意味着在函数声明期间变量尚未定义。
您应该做的是简单地将这些参数预设为None,并在函数体中在这种情况下将它们预设为这些值。这还允许用户实际解析一个值到方法中,这样就可以得到默认值,而无需从类内部的某个位置访问这些值。

非常感谢您深入的解释,让我对此有了更清晰的认识。 - Night Train
正如下面rightfold所指出的,我们需要小心None是否已经被用户用作有效值,例如在这段代码中,如果None意味着不应用限制。 - Joachim Wagner

2
关键字参数的默认值是在模块构建时绑定的,而不是在类实例构建时绑定的。这就是为什么在此上下文中未定义self的原因。
关于默认值的相同事实可能会在您希望关键字参数的默认值每次调用函数时更新时创建各种问题。当您运行程序时,您会发现你期望更新的默认值始终设置为在模块最初初始化时构造的值。
我建议在这两种情况下使用None作为默认关键字参数,就像poke和其他人建议的那样。您的代码可能如下所示:
def gamesplayed(self, team=None, startyear=None, endyear=None):
    if not startyear:
        startyear = self._firstseason
    if not endyear:
        endyear = self._lastseason

2
最好使用“if year is None”来覆盖所有年份,以防止有人使用0和9999调用函数。 - Joachim Wagner

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