我正在将一个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(),为什么?
答案 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)