2012-05-23 29 views
4

爲什麼我在Python代碼中看不到以下內容?爲什麼不將__init__分配給超類的__init__?

class A: 
    def __init__(self, ...): 
     # something important 

class B(A): 
    __init__ = A.__init__ 

它似乎在我的Python 2.5,2.6,2.7和PyPy 1.8的框上工作。

我看到下面有很多,正確做法:使用super

class B(A): 
    def __init__(self, *args, **kwargs): 
     A.__init__(self, *args, **kwargs) 

什麼的。

我喜歡我的第一個例子更好(明確比隱含更好!),但我擔心這是不是因爲某些原因猶太教。它有什麼錯或不好嗎?

編輯:是的,我的意思A.__init__,不self.__init__

+1

我不明白'__init__ = self .__ init__'會在這種情況下做什麼。 'self'不是Python中的關鍵字。 – omz

+0

我想,也許'__init__ = A .__ init__'? – 2012-05-23 22:17:08

+6

有什麼理由打擾嗎?如果你沒有在你的子類中聲明一個,父類的構造函數將被繼承。如果你正在做額外的事情,你只需要重寫它。 – Blckknght

回答

10

當然,它會工作(假設你得到它的權利,它是不是在你的例子),但沒有理由這樣做。如果您想B撥打A__init__(),只需在B上定義__init__()即可自動完成。畢竟,這就是完整的繼承點。

你曾經想要寫B__init__()的唯一原因是,如果你除了初始化B實例什麼做初始化一個A實例想幹的事。在這種情況下,除了調用A.__init__()之外,您還需要編寫其他代碼,因此一個簡單的任務也不適合那裏。

我想你可以使用這個,如果你想保護B__init__()不被猴子修改爲A。但這似乎是一個邊緣案例。更糟的是,這是意想不到的行爲,也是公然否認Python的動態特性。

+0

「protect ... monkey-patch」除了它不會那麼做,因爲查找是在運行時完成的,而不是編譯時間。 –

+0

但是類定義也會在運行時發生。這只是首先發生的事情:在這種情況下,影響B類的唯一A類補丁是在B類加載之前應用的補丁,如果它們在同一個模塊中,可能不會有。 –

+0

你說得對,默認情況下它會調用超類的'__init__'方法。我從來沒有意識到這一點,因爲我總是看到類似我的第二個例子的代碼 - 爲什麼人們會這樣寫呢? (例如,http://stackoverflow.com/questions/6535832/python-inherit-the-superclass-init) –