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:名前'self'が定義されていません

キーワード引数を取り出して単純な位置引数にすると、問題なく動作します。したがって、私の問題がどこにあるのかわかりません。助けてくれてありがとう。

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 に答える