gpt4 book ai didi

python - 在 Python 中删除一个对象和对它的所有引用?

转载 作者:太空宇宙 更新时间:2023-11-04 01:35:40 24 4
gpt4 key购买 nike

有没有办法一次删除对一个对象的所有引用?我知道这不是 Pythonic,所以我会解释我正在尝试做的事情,也许有人知道更好的方法。

我正在为 C 库的 SWIG 包装器编写一个面向对象的包装器。当删除其中一个 C 对象的代理时,它也会删除子对象(直接在 C 中)。我希望这也能触发在 Python 中删除他们的代理对象。否则,我会遇到这样一种情况,即 Python 对象携带无效指针,如果访问它们将会出现段错误。

看起来像这样:

class Parent(object):
def __init__(self):
self.ptr = swig.createParent()
def __del__(self):
swig.deleteParent(self.ptr) # also deletes children

class Child(object):
def __init__(self, parent):
self.ptr = swig.createChild(parent)
def __del__(self):
swig.deleteChild(self.ptr)

这就是我担心的情况:

p = Parent()
c = Child(parent)
del p
# accessing c.ptr now would be bad right?

最佳答案

如果我没理解错的话,你是在包装一些 C 代码,而 C 代码有一个可以调用的析构函数。之后,任何尝试使用指向 C 代码对象的指针都会导致致命崩溃。

我不确定你的确切情况,所以我会给你两个备选答案。

0) 如果 C 对象由于某些不受您控制的原因而被释放,并且您需要确保您的 Python 包装器代码不会崩溃,您需要让 Python 包装器知道 C 对象是否可用或不是。使您的 Python 对象句柄指针不再有效。您可以引发 Python 异常,返回错误代码,或者只是让方法函数变为无操作函数,具体取决于您在做什么。消失的 C 对象不会释放 Python 对象,因此您可以干净利落地处理它。

1) 如果仅在释放 Python 对象时才释放 C 对象,则没有问题。 Python 引用,当它们超出范围或您对它们调用 del() 时,不会释放 Python 对象;他们只是减少该对象的引用计数。当引用计数变为零时,然后对象被释放,您的 __del__() 方法函数可以调用 C 代码以释放 C 对象。

你可以通过运行这段代码来观察它是如何工作的:

class DelTest(object):
def __init__(self):
print "__init__() called: object %08x created" % id(self)
def __del__(self):
print "__del__() called: object %08x destroyed" % id(self)

print "begin"
print "creating object, binding to name d"
d = DelTest()
print "adding reference bound to name x"
x = d
print "adding reference bound to lst[0]"
lst = []
lst.append(d)
print "deleting lst"
del(lst)
print "deleting x"
del(x)
print "deleting d"
del(d)
print "end"

上面的输出:

begin
creating object, binding to name d
__init__() called: object 01e4db50 created
adding reference bound to name x
adding reference bound to lst[0]
deleting lst
deleting x
deleting d
__del__() called: object 01e4db50 destroyed
end

关于python - 在 Python 中删除一个对象和对它的所有引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10068576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com