使用哪种:自我还是超级?

时间:2013-01-12 15:02:45

标签: python oop

我正在将一个python类deque包装成队列,以使我的代码更具可读性:

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(队列,自我).append(),为什么?

4 个答案:

答案 0 :(得分:2)

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

正确的备用版本为super(Queue, self).append

答案 1 :(得分:2)

super()用于调用在派生类中重新定义的基类方法。如果您的班级定义了append()popleft()方法来扩展其行为,那么在super()append()中使用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!!!"

答案 2 :(得分: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)

另外,请注意返回 - 在您的代码中它们丢失了,您无法获得出列值。

答案 3 :(得分:0)

谁告诉过你,甚至考虑使用super代替self是个好主意? 您想要影响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)