2014-10-19 67 views
0

什麼是Python中這樣使用__new__說的__new__體內你返回調用一些其他的結果(基地,元,或其他)類的版本__new__的例子,但你返回分配了預期類的實例,以便__init__將被調用?Python __new__不調用__new__的另一個類的版本?

我猜這是(應該是)非常罕見,但我很好奇,如果有這種用例的例子。我試着尋找tuple__new__的實現的Python源代碼,也嘗試了type的實現,但它似乎並不像在網上快速簡單地找到。

+2

你是什麼意思的「分配的實例」?有些東西像[Singleton](http://stackoverflow.com/a/1810367/1427416)使用'__new__'來返回同一個類的現有實例,但是'__new__'仍然用來構造初始實例,並且重新調用'__init__'在那裏可能是不可取的(儘管它發生在那個例子中)。如果沒有在某個時刻利用內置'object .__ new__',就無法創建一個真正的用戶定義類的新實例。 'tuple'和'type'是在C中實現的,所以它們並不真正使用'__new__'的相同API。 – BrenBarn 2014-10-19 22:24:54

+0

「分配的實例」我只是指'__new__'返回的東西。如何在不觸及其他'__new__'的情況下創建新事物?或者這是一個誤導的問題? – ely 2014-10-19 22:43:05

+0

你不能。你必須調用其他的'__new__',或者通過調用其他類/類型來創建一個對象,該類將在後面調用該類的'__new__'。 – BrenBarn 2014-10-19 22:46:02

回答

1

你不能,那不是你在Python方面可以做的事情。無操作方法將調用object.__new__(cls),該方法返回cls類的裸實例。

>>> class A: 
...  def __new__(cls): 
...   return object.__new__(cls) 
... 
>>> A() 
<__main__.A object at 0x7f9e951577d0> 
+0

只是爲了確認,諸如'tuple .__ new__','object .__ new__'和'type .__ new__'這樣的東西在C級別有它們的實現,並且定義了唯一的一組行爲(在它的根目錄) __new__'。對於類,在鏈的某個層次上,您依賴於某種內置類型的'__new__'(或'object'),而對於元類而言,它與type相同。 '__new__'除了'tuple'的序列型不變性之外還有什麼不變性嗎? – ely 2014-10-20 01:31:56

+0

@EMS:你是什麼意思「一種不變性」? – BrenBarn 2014-10-20 01:42:11

+0

「tuple」子類化是一種獲得一些自定義事物加上不變性的方法,但不是其他類屬性。使用描述符是使事物只讀的一種方式,但不是合法的不可變的。我希望'object .__ setattr__'不會調整任何attrs,但可能有'__new__'中定義的任意屬性或東西。 – ely 2014-10-20 02:25:48