__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是很重要的。
呃,你爲什麼要定義'__del__',你可能不想這麼做...... – SingleNegationElimination