2014-03-05 47 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是很重要的。