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:名称“自我”未定义

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

4

2 回答 2

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

在函数声明中,您尝试使用self. 然而,这不起作用,因为self它只是函数的第一个参数的变量名,它获取对传入的当前实例的引用。因此,self尤其不是始终指向当前实例的关键字(与this其他语言不同) . 这也意味着在函数声明期间尚未定义变量。

您应该做的是简单地用 预设这些参数None,并在这种情况下在函数体内将它们预设为这些值。这还允许用户将值实际解析为产生默认值的方法,而无需从类中的某个位置实际访问这些值。

于 2012-11-11T03:04:24.373 回答
2

关键字参数的默认值在模块构造时绑定,而不是在类实例构造时绑定。这就是为什么self没有在此上下文中定义的原因。

每当您需要一个关键字参数时,关于默认值的相同事实可能会产生各种问题,其中每次调用函数时默认值都会更新。当您运行程序时,您会发现您希望更新的默认值始终设置为模块首次初始化时构造的值。

正如poke和其他人所建议的那样,我建议None在这两种情况下都将其用作默认关键字参数。您的代码可能类似于:

def gamesplayed(self, team=None, startyear=None, endyear=None):
    if not startyear:
        startyear = self._firstseason
    if not endyear:
        endyear = self._lastseason
于 2012-11-11T03:37:18.360 回答