1

私は現在 HeadFirstPython を読んでおり、クラスに関する例があります。

>>> class NamedList(list):
>>>    def __init__(self, a_name):
>>>        list.__init__([])
>>>        self.name = a_name

この場合、なぜステートメントがlist.__init__([])使用されるのですか? また、空の が含まれている理由も理解できません[]

4

2 に答える 2

2

通常、継承元のクラスの初期化子を呼び出すことをお勧めします

ただし、作成者はself空のリストを代用したようです。私は次のいずれかを使用していたでしょう:

super(NamedList, self).__init__()
super(NamedList, self).__init__([])

または、少なくとも明示的なself引数を提供します。

list.__init__(self)

この場合、サブクラス化していlistます。それはイニシャライザが開始する要素の初期リストを受け取りますが、独自のイニシャライザは のみを取るa_nameため、スーパークラスのイニシャライザには明示的な空のリストが渡されます。

このlist.__init__()メソッドは、クリアして拡張するだけです。が複数回呼び出さself.clear(); self.extend(argument)れた場合に、サイズをリセットして再利用可能にするのと同じです。__init__()

新しいリスト オブジェクトをlistイニシャライザに渡すと、呼び出しがまったく役に立たなくなり、ノーオペレーションになります。これは、テクニカル レビューで見逃されたに違いないエラーです。

于 2013-08-19T07:29:33.310 に答える
1

本のコードにはエラーが含まれています。この行list.__init__([])には引数がありません。コメントアウトしても、プログラムがわずかに高速化されることを除いて、何の違いもありません。

あなたの質問を読んだとき、私はほとんど信じられなかっ.

修正された行は次のとおりです。

        list.__init__(self, [])

メソッド (静的メソッドまたはクラス メソッドではない) をクラス オブジェクトで直接呼び出す場合、通常は暗黙的な最初の引数selfを明示的に指定する必要があります。行を修正する別の方法superは、self引数を暗黙的にする を使用することです。

        super(NamedList, self).__init__([])

どちらの[]場合も引数は必要ありませんが、明示的なコードを書くのは良い習慣です。この場合、リストを空にしたいということを伝えます。

この本のコードが行うことは、空のリスト ( []) をself引数として提供することです。これにより、そのリストが (もう一度) 初期化されます。その後、リストへの参照がどこにも保持されないため、すぐにガベージ コレクションが実行されます。つまり、行全体がデッド コードです。

元の行に影響がないことを確認するのは簡単です。一時的に空でないリストに変更[]し、結果のインスタンスにそれらの要素が含まれていないことを確認します。次に、最初の引数として挿入し、リスト内の項目がインスタンスに追加されることを確認します。list.__init__([])NamedListselfNamedList

于 2013-08-19T07:49:11.643 に答える