3

私は Python を学んでいますが、Python がどのようにサブクラスを構築するかについて、私を混乱させる何かを見つけました。

次のようにリストクラスから継承するクラスがあります。

class foo(list):
    def __init__(self, a_bar):
        list.__init__([])
        self.bar = a_bar

私はそれがそこにある必要があることを知っていlist.__init__([])ますが、私はそれについて混乱しています. この行は新しいリスト オブジェクトを作成し、それを何も割り当てないように思われるので、ガベージ コレクションが行われるのではないかと思います。Python は、このリストがオブジェクトの一部であることをどのように認識しますか? 舞台裏で何かが起こっていると思うので、それが何であるかを知りたい.

4

4 に答える 4

3

多重継承で安全な方法は次のとおりです。

class foo(list):
    def __init__(self, a_bar):
        super(foo, self).__init__()
        ...

これにより、おそらく、基本クラスの ctor を呼び出していることがより明確になります。

于 2012-07-28T18:26:54.210 に答える
2

__init__()通常、関数をサブクラス化してオーバーライドするときにこれを行います。

list.__init__(self)

Python 3 を使用している場合は、以下を利用できますsuper()

super().__init__()
于 2012-07-28T18:24:40.977 に答える
1

あなたは部分的に正しいです:

list.__init__([]) 

「新しいリスト オブジェクトを作成します。」しかし、このコードは間違っています。正しいコードは_should_be:

list.__init__(self)

そこに必要な理由は、それ自体を初期化することが(おそらく)重要なlist独自のメソッドを持つから継承しているためです。独自のメソッド__init__()を定義すると、同じ名前の継承されたメソッドを効果的にオーバーライドすることになります。__init__()親クラスのコードも確実に__init__()実行されるようにするには、その親クラスの__init__().

これにはいくつかの方法があります。

#explicitly calling the __init__() of a specific class
#"list"--in this case
list.__init__(self, *args, **kwargs)     

#a little more flexible. If you change the parent class, this doesn't need to change
super(foo, self).__init__(*args, **kwargs) 

詳細については、この質問super()を参照してください。スーパーの落とし穴に関するガイダンスについては、この記事を参照してください。

于 2012-07-28T20:14:16.450 に答える
1

実際のオブジェクトは ではなく で作成され__init__ます__new____init__オブジェクト自体を作成するためではなく、初期化するためのものです。つまり、属性を追加するなど__init__です__new__. __init__オブジェクトを「その場で」(変更することによって) 初期化することになっているため、何も返すべきではありません。したがって、副作用によって機能します。(前の質問ドキュメントを参照してください。)

于 2012-07-28T18:24:40.267 に答える