私は現在 HeadFirstPython を読んでおり、クラスに関する例があります。
>>> class NamedList(list):
>>> def __init__(self, a_name):
>>> list.__init__([])
>>> self.name = a_name
この場合、なぜステートメントがlist.__init__([])
使用されるのですか? また、空の が含まれている理由も理解できません[]
。
私は現在 HeadFirstPython を読んでおり、クラスに関する例があります。
>>> class NamedList(list):
>>> def __init__(self, a_name):
>>> list.__init__([])
>>> self.name = a_name
この場合、なぜステートメントがlist.__init__([])
使用されるのですか? また、空の が含まれている理由も理解できません[]
。
通常、継承元のクラスの初期化子を呼び出すことをお勧めします。
ただし、作成者は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
イニシャライザに渡すと、呼び出しがまったく役に立たなくなり、ノーオペレーションになります。これは、テクニカル レビューで見逃されたに違いないエラーです。
本のコードにはエラーが含まれています。この行list.__init__([])
には引数がありません。コメントアウトしても、プログラムがわずかに高速化されることを除いて、何の違いもありません。
あなたの質問を読んだとき、私はほとんど信じられなかった.
修正された行は次のとおりです。
list.__init__(self, [])
メソッド (静的メソッドまたはクラス メソッドではない) をクラス オブジェクトで直接呼び出す場合、通常は暗黙的な最初の引数self
を明示的に指定する必要があります。行を修正する別の方法super
は、self
引数を暗黙的にする を使用することです。
super(NamedList, self).__init__([])
どちらの[]
場合も引数は必要ありませんが、明示的なコードを書くのは良い習慣です。この場合、リストを空にしたいということを伝えます。
この本のコードが行うことは、空のリスト ( []
) をself
引数として提供することです。これにより、そのリストが (もう一度) 初期化されます。その後、リストへの参照がどこにも保持されないため、すぐにガベージ コレクションが実行されます。つまり、行全体がデッド コードです。
元の行に影響がないことを確認するのは簡単です。一時的に空でないリストに変更[]
し、結果のインスタンスにそれらの要素が含まれていないことを確認します。次に、最初の引数として挿入し、リスト内の項目がインスタンスに追加されることを確認します。list.__init__([])
NamedList
self
NamedList