2014-03-05 56 views
0

我試圖創建一個示例對象來測試__new____init__方法。使用__new__方法創建對象

這是我的示例代碼。當我運行這個 - 我看到"Its been created"味精,並沒有看到信息"Initialized" & "Deleted"味精。

class Test(object): 
    def __new__(self): 
     print 'Its been Created' 

    def __init__(self): 
     print 'Its been Initialzed' 

    def __del__(self): 
     print 'Its been Deleted' 


T = Test()   
+0

呃,你爲什麼要定義'__del__',你可能不想這麼做...... – SingleNegationElimination

回答

3

__new__需要返回類的一個實例(見docs)。你在這裏有效地做的是在NoneType上返回實例(因爲沒有顯式返回值的函數返回None(在這種情況下'the',因爲None是Python中的一個特殊情況單例)),然後具有該對象的__init__調用。解決這個問題的最簡單的方法是這樣的:

class Test(object): 

    def __new__(cls): 
     print 'Creating' 
     return super(Test, cls).__new__(cls) 

    def __init__(self): 
     print 'Intializing' 

    def __del__(self): 
     print 'Deleting' 

這將導致Test.__new__()返回Test的超'的結果(object在這種情況下)__new__方法,新創建的實例。

它可以幫助您瞭解發生了什麼事情,如果你嘗試以下方法:

class A(object): 

    def __new__(cls): 
     print 'A.__new__' 
     return super(A, cls).__new__(cls) 

    def __init__(self): 
     print 'A.__init__' 

    def __del__(self): 
     print 'A.__del__' 

class FakeA(object): 

    def __new__(cls): 
     print 'FakeA.__new__' 
     return A.__new__() 

    def __init__(self): 
     print 'FakeA.__init__' 

    def __del__(self): 
     print 'FakeA.__del__' 

a = A() 
fa = FakeA() 
del a 
del fa 

但是,要注意每個實例的每個時間__del__is not guaranteed to be called是很重要的。