Python: how to “kill” a class instance/object?
我希望一个蟑螂类在达到一定程度的"饥饿"时"死亡",但我不知道如何删除该实例。我的术语可能有误,但我想说的是,我的窗户上有很多"蟑螂",我希望特定的蟑螂完全消失。
我会给你看代码,但它很长。我将roach类添加到一个mastermind类roach人口列表中。
一般来说:
- 每个绑定变量->对象增加内部对象的引用计数器
减少引用有几种常用方法(取消引用对象->变量绑定):
- 退出声明变量的代码块(第一次使用)
- 销毁对象将释放所有属性/方法变量的引用->对象引用
- 调用
del variable 也将删除当前上下文中的引用 在删除了对一个对象的所有引用(counter==0)之后,它就成为垃圾收集的最佳候选对象,但不能保证将对其进行处理(此处引用):
CPython currently uses a reference-counting scheme with (optional)
delayed detection of cyclically linked garbage, which collects most
objects as soon as they become unreachable, but is not guaranteed to
collect garbage containing circular references. See the documentation
of the gc module for information on controlling the collection of
cyclic garbage. Other implementations act differently and CPython may
change. Do not depend on immediate finalization of objects when they
become unreachable (ex: always close files).
号
对象上存在多少引用,请使用sys.getrefcount
用于配置/检查垃圾收集的模块是gc
在销毁对象时,GC将调用object.deluuuu方法(此处为附加引用)
一些不可变的对象(如字符串)是以特殊的方式处理的,例如,如果两个变量包含相同的字符串,则它们可能引用相同的对象,但有些不检查标识对象,为什么ID(…)返回的值会更改?
使用内置函数ID可以找到对象的ID
module memory_profiler看起来很有趣-一个监控python程序内存使用情况的模块
这个主题有很多有用的资源,一个例子:在python中查找对一个对象的所有引用
不能强制删除一个python对象;当没有任何对象引用它时,它将被删除(或者当它处于一个循环中时,只引用循环中的项目)。你必须告诉你的"主脑"删除它的参考。
1 | del somemastermind.roaches[n] |
1 2 3 4 | for i,roach in enumerate(roachpopulation_list) if roach.hunger == 100 del roachpopulation_list[i] break |
号
从填充列表中删除该实例(包含所有roach实例)。
如果你的蟑螂是在PyGame中创建的精灵,那么简单的.kill命令将删除该实例。