【问题标题】:Python Keyword Arguments in Class Methods类方法中的 Python 关键字参数
【发布时间】:2012-10-30 23:02:31
【问题描述】:

我正在尝试编写一个采用 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' 未定义

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

【问题讨论】:

    标签: python class arguments keyword


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 如果有人用 0 和 9999 调用函数来覆盖所有年份,最好使用“if year is None”。
    【解决方案2】:
    def gamesplayed(self, team = None, startyear = self._firstseason, endyear = self._lastseason):
    

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

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

    【讨论】:

    • 感谢您的深入解释。它让一切变得更加清晰。
    • 正如 rightfold 下面指出的那样,需要注意 None 尚未用作用户可能传递的有效值,例如在此代码中,如果 None 意味着不应用限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2013-08-16
    • 2011-02-14
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多