我正在尝试重载new
,这是我的尝试: -
class String(object):
def __new__(cls, *args, **kargs):
print "in __new__"
return super(String, cls).__new__(cls)
def __init__(self):
print "Initiating instance of String"
raise Exception
def __del__(self):
print "Deleting instance of String"
我在许多地方读过,实际上__new__
创建了实例,__init__
只是为了初始化实例。我故意在__init__
中抛出异常让它失败。这里调用new
返回实例,但init
失败,所以我期待一个没有任何属性的实例。但结果让我感到惊讶 -
st = String()
in __new__
Initiating instance of String
Traceback (most recent call last):
File "<pyshell#89>", line 1, in <module>
st = String()
File "<pyshell#88>", line 7, in __init__
raise Exception
正如预期的那样__init__
失败了,接下来我尝试打印新创建的实例'st'
并且结果让我感到惊讶,它在打印前删除了实例。
>>> print st
**Deleting instance of String**
Traceback (most recent call last):
File "<pyshell#90>", line 1, in <module>
print st
NameError: name 'st' is not defined
请帮助我理解这种奇怪的行为。
注意 - 我知道何时应该重载__new__
以及何时不应该重载{{1}}。
答案 0 :(得分:3)
在Python设法将内存中的对象分配给变量名之前引发了异常。因此,内存中对象的引用计数器是 0 ,因此它被“垃圾收集”,并且你得到name is not defined
例外。 / p>
评论更新:
如果阈值被填满,Python在尝试为新对象分配内存时会运行GC。在你的情况下,它可能是达到0代的门槛,因为它是新的&#39;失败的地方&#39; String
对象应该是。触发GC的事件本身是执行print
的内存分配。