簡體   English   中英

Python慣例:我通常應該調用超類'__init__嗎?

[英]Python convention: should I normally call the super class' __init__?

我讀了這個問題得分最高的答案,它說如果我們需要,我們應該調用超級班級' __init__ ,而我們不需要。 但我的問題更多是關於慣例。

如果我通常情況下 ,作為一般規則,總是調用父類的__init__在我的課__init__ ,無論與否我目前‘需要’該方法中的功能?

有些類需要調用它們的__init__方法才能工作。 他們使用__init__方法設置所需的屬性。

例:

class one ():
    def __init__ (self):
        self.number = 20
    def show_number(self):
        return self.number

如果從上面的類繼承,則需要調用其__init__方法以定義屬性number 如果未調用__init__方法,則在嘗試調用方法show_number時可能會出錯。

至於語法,如果繼承類的__init__方法沒有任何反應,則不需要調用它。 如果您認為不調用__init__方法會使其他人感到困惑,您可以隨時用注釋解釋您的推理。 即使您不需要它也不會對它進行任何傷害。

這個答案有一些貶低,因為貶低者在焦點上不同意我,也許在“慣例”意味着什么。 我認為在編寫代碼時我們大多同意實際的做法。


,你不應該通常情況下 ,作為一般規則,總是調用父類的__init__在類的__init__不管你是否當前“需要”的功能,但其方法

但請注意,我的重點是最后一句,從“不管”開始, 就是我的“不”答案的意思。 你不應該在你的Python代碼中拋出一些東西“只是因為有人告訴你”或“只是因為這似乎是大多數人正在做的事情”。

如果需要,你應該包括一些東西,如果不需要,你不應該包括一些東西。

通常情況下,有些人會認為通常情況下,您確實希望在子類的__init__方法中調用超類的__init__方法。 我大部分時間都是這樣做的。

但為什么?

至關重要的是,這不是因為一些“慣例”。 我這樣做是因為我的子類通常需要與超類相同的初始化,以及一些額外的自定義。 請注意,額外的自定義是首先覆蓋__init__的全部原因。 如果你的子類的初始化意味着與超類的初始化相同,那么你根本就不應該定義自己的__init__


在Python中編寫一些你不需要的代碼並不是一種慣例。 有些人有自己的慣例來包含不必要的東西; 也許是以“防御性編程”的名義,或者因為它們被用於需要更多樣板的不同語言。

Python的約定出現在你可以選擇多種表達有用的方法之間。 的確,Python並不強調簡潔性。 但這並不意味着它也強調冗長。 所以,我要補充一下,以防不清楚:

作為一般規則,您通常應該始終避免使用不必要的樣板代碼。 (而不只是在Python中。)

[對於那些認為“通常總是”這句話很尷尬或荒謬的人:我完全同意,但我試圖通過重復提問者自己選擇的詞來強調我的觀點。

是。 作為一般規則,你應該調用父類的__init__從子類的__init__方法。 這不是Python慣例,它是OO最佳實踐建議您應該做的事情(考慮到您恰好使用的語言,將此決定留給您):

超類不了解子類,但是子類應該知道它繼承的超類的語義。 最終,由子類來維護真正的子類型的一致行為(遺憾的是,Python語言對程序員的幫助不大)。 作為子類實現者,您可以決定是否需要調用超類__init__ ,就像您決定是否需要/想要調用超類的任何方法的實現一樣。 但是,對象的初始化往往是許多對象生命周期中非常重要的一步。 在對象初始化之前,可以說對象不是真正的給定類的實例。 在所有理智的OO語言中,這是一個隱含且重要的后置條件,當您實例化某個對象時,某些事情已經發生,我們可以依賴於已經發生的事情,初始化(或其他語言中的“構造”)是中心事物 -它是否涉及復雜的參數驗證和計算值生成,或者只是一個空操作。 因此,如果你不打電話給super的初始化程序,你最好知道你的用途。

調用super的__init__作為一般規則的另一個論點是,如果你沒有編寫超類,或者你沒有嚴格控制版本, __init__的實現可能會在未來發生變化(是否會為__init__添加一些東西來調用主要的版本?我不確定,但我敢打賭,很多人不會因此而碰到主要版本號,即使技術上他們應該這樣做。 因此,如果您調用super的__init__您的代碼不太可能與超類實現的更新中斷。


更新:在回答此問題之前,應該已閱讀鏈接的問題。 那里的大多數答案都與這里的一般情緒相呼應 - 也許不是以相同的術語或強烈支持調用__init__()作為一般規則。 但我會把這個答案留給落在這里的其他人。

暫無
暫無

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

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