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

鉴于这两个选择,您应该使用self.append,因为您使用的代码super不是有效的 Python。

正确的替代版本是super(Queue, self).append.

于 2013-01-12T15:05:11.133 回答
2

super()用于调用派生类中重新定义的基类方法。如果您的类正在定义append()popleft()扩展其行为的方法,那么在super()内部使用append()and是合理的popleft()。但是,您的示例没有从 重新定义任何内容deque,因此不需要super().

以下示例显示了何时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 回答
1

去吧self(撇开你的使用super不正确,如 Borealid 所说)。

但是,我相信在这种情况下最好不要扩展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 附加到模块范围(不要介意 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 回答