3

これは Learning Python 第 4 版からの抜粋です。その機能は、リストを使用してセットをサブクラス化することです。しかし、5 行目がわかりませんlist.__init__([])。助けてください。このコード行をコメントアウトしても、コードは機能します。なんで?

### file: setsubclass.py

class Set(list):
    def __init__(self, value = []):      # Constructor
        list.__init__([])                # Customizes list 
        self.concat(value)               # Copies mutable defaults

    def intersect(self, other):          # other is any sequence
        res = []                         # self is the subject
        for x in self:
            if x in other:               # Pick common items
                res.append(x)
        return Set(res)                  # Return a new Set

    def union(self, other):              # other is any sequence
        res = Set(self)                  # Copy me and my list
        res.concat(other)
        return res

    def concat(self, value):             # value: list, Set . . .
        for x in value:                  # Removes duplicates
            if not x in self:
                self.append(x)

    def __and__(self, other): return self.intersect(other)
    def __or__(self, other):  return self.union(other)
    def __repr__(self):       return 'Set:' + list.__repr__(self)

if __name__ == '__main__':
    x = Set([1,3,5,7])
    y = Set([2,1,4,5,6])
    print(x, y, len(x))
    print(x.intersect(y), y.union(x))
    print(x & y, x | y)
    x.reverse(); print(x)
    x
4

4 に答える 4

4

この線のことですか?

    list.__init__([])

任意の型のメソッドをオーバーライドする場合は__init__、常に継承された__init__メソッドを呼び出すことをお勧めします。つまり__init__、基本クラスのメソッドです。このようにして、親クラスの初期化を実行し、子クラスに固有の初期化コードを追加します。

__init__将来のバージョンとの互換性を確保するために、親の が何もしないと確信している場合でも、この方法に従う必要があります。

更新: Lauritz が別の回答で説明したように、次の行

    list.__init__([])

間違っている。詳細については、彼の回答と他の回答を参照してください。

于 2013-08-01T08:15:44.233 に答える
3

つまりlist.__init__([])

サブクラス初期化子から基本初期化子を呼び出します。サブクラスは、基本クラスの初期化子を独自のものに置き換えました。

この場合、バインドされていないイニシャライザが代わりに空のリストで呼び出されたため、そのコメントアウトはたまたま機能するためself、ノーオペレーションです。これはおそらく著者に代わってのエラーです。

ただし、一般的には、サブクラス化するときに基本クラスがその初期化コードを実行していることを確認することをお勧めします。そうすれば、基本クラスのメソッドが依存するすべての内部データ構造が正しく設定されます。

于 2013-08-01T08:15:19.807 に答える
1

この行は__init__、基本クラスのコンストラクターを呼び出す Set クラスでコンストラクターを作成するようなものです。

あなたはすでにこれを見たことがあるかもしれません:

class Set(list):
...   
def __init__(self, *args, **kwargs):
        super(Set, self).__init__(args, kwargs)
        # do something additional here
于 2013-08-01T12:17:18.677 に答える