2012-10-11 42 views
5

我明白__new__是什麼(以及它與__init__有什麼不同),所以我對定義不感興趣,我對什麼時候以及如何使用__new__感興趣。Python的__new__有什麼用例?

文檔說:

一般情況下,你不應該需要重寫__new__除非你繼承一個不變的類型像strintunicodetuple

但我做不到不要想到其他情況下使用__new__或如何正確使用它(例如,當子類化不可變類型或爲什麼它需要在這種情況下)。

那麼,何時,爲什麼以及如何使用__new__

我對用例感興趣,而不是它所做的(我知道它是幹什麼的)。

+2

@MFFarlane:我知道,我對你需要使用__new__時的情況感興趣(比「不可變類型的子類化」更多。**這不是重複。** – JohnDoDo

+1

@close選民這個問題不是重複的,所引用的問題是*爲什麼'__init__'總是在'__new__' *之後被調用(不是),這個問題要求'__new__'的實際用例。這個問題 –

+0

@lazyr:希望你不介意,我把你的意見納入問題。謝謝! – JohnDoDo

回答

10

回答我自己,我已經將它用於

  • 創建一個單例模式(儘管有ways要做到這一點,而無需使用__new__
  • dynamically extend classes from external modules而不實際編輯源
  • 定製類在元類中(儘管__call__也可以用於我認爲的)
  • 擴展datetime.datetime類(這是不可變的),以在沒有爭論的情況下返回當前時間發言:並呼籲說法strptime如果調用一個字符串參數繼承一個不可變的類型時,如果你想改變用於構建不可變的參數

你需要__new__,我在datetime想要的結果例如,或者您根本不想調用父項__new__,而是返回創建另一種方式或甚至完全不同類型的實例。當你在__init__時,以任何方式改變對象爲時已晚,所以你需要在__new__中完成。

+0

非常感謝! – JohnDoDo

0

潛在用例可能是一個「工廠類」,它根據實現返回不同類的實例。

相關問題