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

阿罗克·塔库尔

我正在尝试超载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__以使其失败。在这里调用tonew返回实例但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__,什么时候不应该过载

尼基塔

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

更新注释:如果阈值已满,Python会在尝试为新对象分配内存时运行GC。在您的情况下,可能是达到第0代的阈值,因为它String应该是新的“失败”对象所在的位置触发GC的事件本身就是要执行的内存分配print

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

错误:尝试删除已被删除的对象

EntityFramework:仅当父对象被删除时才CascadeOnDelete

替换/终止实例时,由自动伸缩组启动的实例使用的ebs卷是否被删除?

尝试打印对象的值时为nullexception

Android Studio-Firebase现有子级在尝试更新值时将被删除

尝试添加新密钥时,所有其他密钥都将被删除

在后端删除时,在“本地解析”数据存储区中固定的对象也会被删除吗?

在领域中删除项目时收到错误“对象已被删除或无效”

当我删除子对象时,Django被删除了父关系

以前的字符实例不会被删除

当我尝试使用 indexOf 和 splice 删除指定数组时,另一个值被删除

JavaFX tableview,当我添加一个新对象时,我的列表被删除

当我将Object设置为NSMutableDictionary时,先前添加的对象将被删除

仅当祖父母被删除时,如何触发子对象的:destroy?

object() 尝试删除模型实例时不带任何参数

FXML 对象在使用前被删除

如何防止对象在Django中被删除?

错误:对象已被删除或无效。(领域)

HelloWindow对象是否被删除?

终止应用程序的当前实例时,iOS应用程序Documents /目录中的数据会被删除吗?

元素被删除时的DOM事件

活动别名在应用更新时被删除

使用mkstemp()创建的文件被删除时?

“过时的文件句柄”错误,当进程尝试读取文件时,该其他进程已被删除

尝试通过API在销售订单行中添加服务产品时出现“记录不存在或已被删除”错误

尝试从列表视图中删除对象时抛出异常

我尝试删除对象时,Spring jpaRepository抛出TransactionRequiredException

尝试删除 C++ 中的对象时出现内存泄漏

为什么此数组值被删除但仍然打印?