1

コードを読みやすくするために、Python クラスの両端キューをキューにまとめています。

from collections import deque

class Queue(deque):
    def enqueue(self,a):
        super(Queue, self).append(a)

    def dequeue(self,a):
        super(Queue, self).popleft(a)

私の質問は、ここで self.append() または super(Queue, self).append() のどちらを使用する必要があるかです。なぜですか?

4

4 に答える 4

2

super()派生クラスで再定義された基本クラス メソッドを呼び出すために使用されます。クラスがその動作を定義append()し、メソッドを拡張する場合、 and内でpopleft()使用するのが合理的です。ただし、この例では から何も再定義していないため、 は必要ありません。super()append()popleft()dequesuper()

次の例は、super()がいつ使用されるかを示しています。

class Queue(deque):
    def append(self, a):
        # Now you explicitly call a method from base class
        # Otherwise you will make a recursive call
        super(Queue, self).append(a)
        print "Append!!!"

ただし、複数の継承の場合、super()基本クラスからメソッドを呼び出すことを許可するよりも複雑になります。詳細な理解には、MRO (メソッド解決順序) の理解が必要です。その結果、上記の例でも、通常は次のように記述した方が適切です。

class Queue(deque):
    def append(self, a):
        # Now you explicitly call a method from base class
        # Otherwise you will make a recursive call
        deque.append(self, a)
        print "Append!!!"
于 2013-01-12T19:43:49.370 に答える
2

これら 2 つの選択肢がある場合、使用self.appendするコードsuperは有効な Python ではないため、 を使用する必要があります。

正しい代替バージョンはsuper(Queue, self).append.

于 2013-01-12T15:05:11.133 に答える
1

行きましょう( Borealidが述べたようselfに、あなたの使用が間違っていることはさておき)。super

ただし、この場合は拡張せdequeにラップする方がよいと思います。

from collections import deque

class Queue(object):
    def __init__(self):
        self.q = deque

    def enqueue(self, a):
        return self.q.append(a)

    def dequeue(self, a):
        return self.q.popleft(a)

また、戻り値に注意してください。コードではそれらが欠落しており、デキューされた値を取得できません。

于 2013-01-12T15:07:41.643 に答える
0

superの代わりに使用することを考えることさえ良い考えだと誰があなたに言いましたselfか? モジュールスコープに a を追加するのではなく、Queue の単一のインスタンスに影響を与えたい (super.append がスローするという事実は気にしないでくださいAttributeError)

from collections import deque

class Queue(deque):
    def enqueue(self, a):
        self.append(a)

    def dequeue(self, a):
        self.popleft(a)
于 2013-01-12T15:08:26.533 に答える