2013-01-12 40 views
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()或超(隊列,個體經營).append (),爲什麼?

+2

你爲什麼不試試它?其中一個顯然是正確的答案。 –

+0

超級指向父類,但自指向此類。你不能比較這些關鍵字 – pylover

+0

我試圖使用它,但在兩種情況下都很好,所以我想知道它們之間是否有區別。 – dorafmon

回答

2

鑑於這兩種選擇,您應該使用self.append,因爲您的代碼使用super是無效的Python。

正確的備用版本是super(Queue, self).append

+0

這兩種方法有什麼區別嗎? – dorafmon

1

self(把Borealid說的你用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) 

此外,請注意返回 - 在您的代碼中他們缺少,並且您無法獲取出列值。

+0

爲什麼是這種情況? – dorafmon

+0

通常使用組合(我的例子),而不是繼承(你的例子)更好。它更簡單。此外,在你的情況下,詳細信息(閱讀:方法)或deque將泄漏給你的課堂,抽象將不會很好。 –

+1

一般說成分比繼承好? – dorafmon

0

誰告訴過你,甚至想到使用super而不是self是個好主意? 要影響隊列的單個實例,而不是追加到模塊範圍(從不介意super.append拋出AttributeError事實)

from collections import deque 

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

    def dequeue(self, a): 
     self.popleft(a) 
1

super()被用來調用被重新定義一個基類方法在派生類中。如果你的班級定義了擴展其行爲的方法append()popleft(),那麼在append()popleft()內使用super()是合理的。但是,您的示例從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!!!" 
相關問題