[英]Proper use of super in Python — should I reference the class name explicitly?
[英]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下一堂課是CreateView
, CreateView
的分配方法也將被調用。
super
要真正動腦筋可能很棘手-我建議閱讀Raymond Hettinger的“超級就是超級”文章,以獲取一些想法和最佳實踐。
1您可以通過使用inspect.getmro(ReviewCreateView)
或僅查看ReviewCreateView.__mro__
來檢查MRO ReviewCreateView.__mro__
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.