类方法中的Python关键字参数

时间:2012-11-11 02:51:31

标签: python class arguments keyword

我正在尝试编写一个带有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:名称'self'未定义

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

3 个答案:

答案 0 :(得分:5)

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

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

您应该做的是简单地使用None预设这些参数,并在功能体内预设那些值。这也允许用户实际解析导致默认值的方法的值,而不必实际访问类中某个地方的值。

答案 1 :(得分: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 :(得分:-1)

你不能那样引用self。我不知道在关键字参数的默认值中引用self的方法。您可以改为使用占位符,并在函数体中设置默认值。

_placeholder = object()

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

    # normal code here