2016-12-28 7 views
0

これは本の最初の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) 
+0

本の中で 'def __init __(self、a_times = [])'を見たことがありますか?もしそうなら、あなたは本を変えることを検討すべきです。 http://stackoverflow.com/documentation/python/3553/common-pitfalls/12258/mutable-default-argument#t=201612281429272429582 – DeepSpace

+1

私が見ているように、 'AthleteList'は' list'型なので '[]'親オブジェクトを初期化するために 'self'の代わりに使用されます(コンストラクタは引数を必要としません)。しかし、私の目には、これは非常に汚れています。あなたの最初のコードスニペットで 'list .__ init __([1、2、3])'を試して、emtpy 'a_times'を使ってオブジェクトを作成してください。値は表示されません。 – ppasler

+0

は['UserList'](https://docs.python.org/3/library/collections.html?highlight=namedtuple#collections.UserList)で簡単に一覧から継承できます。ここではすべてがexpcectedとして動作します。 –

答えて

1

これはおそらくlistをサブクラス化する最も安全な方法です。基本クラスとしてUserList使用し、物事が期待どおりに動作:確かにすべてのご質問にお答えしませんが、出発点であってもよい

from collections import UserList 

class AthleteList(UserList): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 

athlete_list = AthleteList((1, 2, 3)) 
print(athlete_list) # -> [1, 2, 3] 

ここでは、それに関する詳細な回答があります:https://stackoverflow.com/a/25464724/4954037

関連する問題