python - 为什么我不能在 Python 中删除(删除)静态列表的明显“现有实例”?
问题描述
我的目的如下:如果创建了新实例,则必须将该实例添加到静态列表中。并且当一个创建的实例被删除时,它必须从静态列表中删除
并且终结器方法,必须使用' del ()'。
我遇到问题的python代码如下:
class Staff:
staffs = [] # static customer list
def __init__(self, name):
self.name = name
print("A staff is created!")
def __del__(self):
Staff.staffs.remove(self)
print("A staff is deleted!")
if __name__ == '__main__':
# create a staff
Staff.staffs.append(Staff("Harry"))
# delete a staff
Staff.staffs[0].__del__()
错误如下:
异常被忽略:<function Staff. 删除0x0000028A3675EF70>
回溯(最近一次调用最后):文件“(路径)\temp.py”,第 11 行,在del Staff.staffs.remove(self)
ValueError: list.remove(x): x 不在列表中
我可以检查创建的实例是否存在于静态列表中,如下面的代码
def check(self):
print("Length of Static List:", len(Staff.staffs))
print("self", self)
for a_staff in Staff.staffs:
if a_staff == self:
print("a_staff", a_staff)
print()
结果:
静态列表长度:1
self < main .Staff 对象位于 0x000001FF7506CFD0>
a_staff < 0x000001FF7506CFD0 处的主要.Staff 对象>
实例的内存地址完全一样,但我不知道为什么解释器说静态列表中没有实例。
当我在 Java 中运行类似的代码时没有问题。
为什么会发生错误?
解决方案
注意
class Staff:
staffs = [] # static customer list
def __init__(self, name):
self.name = name
print("A staff is created!")
def delete(self):
Staff.staffs.remove(self)
print("A staff is deleted!")
if __name__ == '__main__':
# create a staff
Staff.staffs.append(Staff("Harry"))
# delete a staff
Staff.staffs[0].delete()
工作正常。我所做的只是重命名__del__
为删除。您可以尝试解释其上的文档,其中指出
由于调用del () 方法的不稳定环境,在它们执行期间发生的异常将被忽略,而是向 sys.stderr 打印警告。
上面的引用解释了你的错误。但是,正如其他帖子概述__del__
的那样,
99.9% 的时间都不需要的非常低级的方法
所以只使用上面的代码就足够了,它将您的实例标记为垃圾收集。
如果您必须向__del__
命令添加其他内容,请尝试以下操作:
class Staff:
staffs = [] # static customer list
def __init__(self, name):
self.name = name
print("A staff is created!")
def __del__(self):
print("A staff is deleted!")
if __name__ == '__main__':
# create a staff
Staff.staffs.append(Staff("Harry"))
print(f"The length of Staff before delete is: {len(Staff.staffs)}")
# delete a staff
del Staff.staffs[0]
print(f"The length of Staff after delete is: {len(Staff.staffs)}")
这输出:
创建了一个员工!
删除前的 Staff 长度为:1 删除
了一个员工!
删除后的 Staff 长度为:0
因此该项目被删除,您的文本被打印,无一例外!
推荐阅读
- java - 在获取未知数量的输入然后获取另一个输入时,线程“main”java.util.NoSuchElementException 中的异常
- google-sheets - 如何通过 Google Docs 计算(搜索)多个工作表中的特定文本?
- php - Codeigniter 数据库会话驱动程序/会话驱动程序中的会话问题
- rstudio - rStudio 3.6 的 Rtools
- c# - 注入前配置实例
- python - x += [0] 和 x = x + [0] 有什么区别?
- node.js - 在单元测试中跳过 expressjs 中间件
- python - 通过 numpy 数组中的文件路径列表将文本文件保存到多个位置
- json - 在 BigQuery 中加载 JSON / 从位置开始的行中的 JSON 解析错误 ...:解析器在字符串结尾之前终止
- javascript - 从 JavaScript 中的自定义对象调度事件