これは本の最初のpython(pg 208第6章)のものです。私は私の独自のバージョンを書きに来たとき、私は私がextend
ステップをスキップできると思っていた初期化リストのスーパークラス - 自己パラメータは時々必要ですが他は必要ありませんか?
class AthleteList(list):
def __init__(self, a_times=[]):
list.__init__([])
self.extend(a_times)
:
class AthleteList(list):
def __init__(self, a_times=[]):
list.__init__(a_times)
それを最初は私がように、サブクラスの初期の本の中で例を見ましたリストを印刷することになる:
test = AthleteList([1,2,3])
print(test)
出力が[]
なので、初期化に問題があります。 When searching aroundは、私が見つけたすべてのケースで、私はそれが必要な明示的self
を渡すことによって、スーパークラスを初期化するために見た:
class AthleteList(list):
def __init__(self, a_times=[]):
list.__init__(self, a_times)
:リストスーパークラス自体が、それはそのリストを初期化することができるように引数として渡されたオブジェクトが必要値。最初の例(実際には動作します)にself
がなぜ必要でなかったのを除いてですか?空のリストで初期化しても、self
のリストが空になるように、まだself
オブジェクトを渡す必要があります。私もデフォルトでそれを行うようですが、最初の空のリストにそれを初期化する必要はありません、と私は後で拡張することができます:
class AthleteList(list):
def __init__(self, a_times=[]):
self.extend(a_times)
本の中で 'def __init __(self、a_times = [])'を見たことがありますか?もしそうなら、あなたは本を変えることを検討すべきです。 http://stackoverflow.com/documentation/python/3553/common-pitfalls/12258/mutable-default-argument#t=201612281429272429582 – DeepSpace
私が見ているように、 'AthleteList'は' list'型なので '[]'親オブジェクトを初期化するために 'self'の代わりに使用されます(コンストラクタは引数を必要としません)。しかし、私の目には、これは非常に汚れています。あなたの最初のコードスニペットで 'list .__ init __([1、2、3])'を試して、emtpy 'a_times'を使ってオブジェクトを作成してください。値は表示されません。 – ppasler
は['UserList'](https://docs.python.org/3/library/collections.html?highlight=namedtuple#collections.UserList)で簡単に一覧から継承できます。ここではすべてがexpcectedとして動作します。 –