尝试打印时实例对象被删除

时间:2016-02-20 19:05:23

标签: python python-2.7

我正在尝试重载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}}。

1 个答案:

答案 0 :(得分:3)

在Python设法将内存中的对象分配给变量名之前引发了异常。因此,内存中对象的引用计数器 0 ,因此它被“垃圾收集”,并且你得到name is not defined例外。 / p>

评论更新: 如果阈值被填满,Python在尝试为新对象分配内存时会运行GC。在你的情况下,它可能是达到0代的门槛,因为它是新的&#39;失败的地方&#39; String对象应该是。触发GC的事件本身是执行print的内存分配。