0

我想了解python中的this piece of code。根據我的理解,當您不想顯式編寫基類的名稱時,super用於從派生類調用基類函數。但是如下所述,如果基類本身使用super來調用某個函數,這意味着什麼?什麼時候應該在python的Base類中使用關鍵字super?

class ReviewViewMixin(object): 
    def dispatch(self, request, *args, **kwargs): 
     # some code 
     return super(ReviewViewMixin, self).dispatch(request, *args, **kwargs) 


class ReviewCreateView(ReviewViewMixin, CreateView): 
    # some code 
    def dispatch(self, request, *args, **kwargs): 
     super(ReviewCreateView, self).dispatch(request, *args, **kwargs) 

我試着創建類似上面的幾個樣本類,但我得到了預期的「沒有這樣的參數」異常。

回答

3

你會注意到你的類ReviewCreateView兩個(直接)基類。 super對於確保dispatch方法在這兩個基類的被調用是必要的。

每當創建一個類時,python會查看繼承樹並將其展平,從而創建一個名爲"Method Resolution Order" (MRO)的東西。在這種情況下,您的MRO可能是:

ReviewCreateView, ReviewViewMixin, CreateView, ..., object 

什麼super所做的就是檢查當前的MRO,並呼籲在MRO的下一個類中的方法。您調用堆棧將類似於:

ReviewCreateView.dispatch (super) -> ReviewViewMixin.dispatch (super) -> CreateView.dispatch 

現在注意,如果ReviewViewMixin沒有在那裏super,調用堆棧會用它結束。但是,由於它具有super,並且MRO中的下一個類是CreateView,CreateView的調度方法也將被調用。

super可能會非常棘手以真正包裹你的頭 - 我建議閱讀Raymond Hettinger的文章"super is Super",以獲得一些想法和最佳實踐。

您可以通過使用inspect.getmro(ReviewCreateView),還是僅僅在ReviewCreateView.__mro__

+0

這是絕對簡單和燦爛的解釋檢查維修。非常感謝。我花了太多時間來弄清楚發生了什麼事。 – Sathish

相關問題