Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python删除类对象_Python_Oop - Fatal编程技术网

Python删除类对象

Python删除类对象,python,oop,Python,Oop,我正在寻找一种方法来删除一个类的实例,我看到的安全地删除实例的方法与Clint Miller提出的方法类似。对于我正在尝试做的,这似乎不是一个可行的选择 我的问题是,下面的方法是否可以安全地摆脱类实例,如果不能,如何(如果有的话)对其进行修改以使其安全 class myClass: _reg = [] def __init__(self, *args): self.args = args self._reg.append(self) .

我正在寻找一种方法来删除一个类的实例,我看到的安全地删除实例的方法与Clint Miller提出的方法类似。对于我正在尝试做的,这似乎不是一个可行的选择

我的问题是,下面的方法是否可以安全地摆脱类实例,如果不能,如何(如果有的话)对其进行修改以使其安全

class myClass:
    _reg = []

    def __init__(self, *args):
        self.args = args
        self._reg.append(self)

    ...

    def close(self):
        self._reg.pop(self._reg.index(self))
myClass的实例只有这样创建:
myClass(arg1,arg2…
与此相反:
a=myClass(arg1,arg2…
或通过类似
myFunc
的函数创建。当不再需要该实例时,将调用其close函数

def myFunc(*args):
    ...
    myClass(newArg1, newArg2...)
另外,您可以假设不会对
myClass.\u reg
中的项目进行新的引用,并提前感谢

编辑:注册表的存在是为了跟踪
myClass
实例的存在。这不仅仅是一种试图立即删除它们的过于复杂的方式(如果是这样的话,我可能不会创建它们)

每个实例需要存在和执行为简洁(和相关性)而省略的功能的时间量变化很大


至于为什么我需要确保删除未使用的实例,需要在未指定的时间创建新的实例,并且每个实例的某些预期功能将开始相互冲突,如果不删除或以其他方式禁用它们,将很难处理这些冲突。除此之外,如果发生这种情况,实例列表几乎肯定会变得非常长,这可能会导致其他问题。

为什么要保存对实例的引用?为什么需要显式删除实例?可以,但重点是什么?如果您从未将实例分配给变量,那么当它们超出范围时,它们将被销毁。那么,为什么要添加一个您不需要的注册表,只是为了做一些无论如何都会发生的事情呢?添加注册表是因为这是一种简单的方法,可以让另一个函数(此处未提及)检查myClass所有实例的状态,并且我需要将它们保留一段未指定的时间。显式优于隐式(Python的禅宗)。先执行
a=myClass(arg1,arg2,…)
,然后执行
my\u common\u列表。追加(a)
。或创建
函数
(IMHO应与类分开)这一步就可以做到。但是不要把它放在
\uuuuu init\uuuu
中。一般来说,你不希望在
\uuuuu init\uuuuu
中出现这种副作用。另外
\ureg
列表也应该与
myClass
分开。你向我们展示的代码将很难维护。顺便说一句
close
方法不是线程afe.从理论上讲,您当前拥有的应该足够了。只要对象从
\u reg
弹出,它的引用计数就应该下降到1(引用计数通常比您预期的高1),垃圾收集器将对其进行清理。您还可以通过调用
gc.collect()在那里强制清理,然后在
close()
。您必须稍微使用
gc
模块,以确保您所期望的正在发生。但这一切听起来都很糟糕。为什么要保存对实例的引用?为什么需要显式删除实例?可以,但有什么意义?如果您从未将实例分配给变量,它们会被删除'将在它们超出范围时被销毁。那么,为什么要添加一个不需要的注册表,而只做一些无论如何都会发生的事情呢?添加注册表是因为使用另一个函数(此处未提及)很容易能够检查myClass的所有实例的状态,我需要将它们保留一段未指定的时间。显式优于隐式(Python的Zen)。先执行
a=myClass(arg1,arg2,…)
,然后执行
my_common_list。附加(a)
。或者创建
函数
(IMHO应该与类分开)这一步就可以做到。但是不要把它放在
\uuuuu init\uuuu
中。一般来说,你不希望在
\uuuuu init\uuuuu
中出现这种副作用。另外
\ureg
列表也应该与
myClass
分开。你向我们展示的代码将很难维护。顺便说一句
close
方法不是线程afe.从理论上讲,您当前拥有的应该足够了。只要对象从
\u reg
弹出,它的引用计数就应该下降到1(引用计数通常比您预期的高1),垃圾收集器将对其进行清理。您还可以通过调用
gc.collect()在那里强制清理,然后在
close()
。您必须稍微玩弄一下
gc
模块,以确保您所期望的正在发生。不过,这一切听起来都很糟糕。