簡體   English   中英

我何時應該在python的基類中使用關鍵字super?

[英]When should I use the keyword super in Base class in python?

我正在嘗試理解python中的這段代碼 根據我的理解,當您不想顯式編寫基類的名稱時,可以使用super從派生類中調用基類函數。 但是,如下所述,如果基類本身使用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)

我嘗試創建像上面這樣的幾個示例類,但是得到了預期的“無此類參數”異常。

您會注意到您的類ReviewCreateView具有兩個 (直接)基類。 super是必需的,以確保在這兩個基類上調用了dispatch方法。

每當創建類時,python都會查看繼承樹並將其展平,這將創建一個稱為“方法解析順序”(MRO)的東西 在這種情況下,您的MRO可能為1

ReviewCreateView, ReviewViewMixin, CreateView, ..., object

super所做的是檢查當前的MRO,並在MRO中的下一個類上調用該方法。 您的調用堆棧將如下所示:

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

現在請注意,如果ReviewViewMixin沒有super ReviewViewMixin ,則調用堆棧將ReviewViewMixin結束。 然而,由於它具有super ,並在MRO下一堂課是CreateViewCreateView的分配方法也將被調用。

super要真正動腦筋可能很棘手-我建議閱讀Raymond Hettinger的“超級就是超級”文章,以獲取一些想法和最佳實踐。

1您可以通過使用inspect.getmro(ReviewCreateView)或僅查看ReviewCreateView.__mro__來檢查MRO ReviewCreateView.__mro__

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM