【问题标题】:Why I can't delete (remove) the clearly 'existing instance' of the static list in Python?为什么我不能在 Python 中删除(删除)静态列表的明显“现有实例”?
【发布时间】:2021-05-27 01:28:21
【问题描述】:

我的目的如下: 如果创建了新实例,则必须将该实例添加到静态列表中。并且当一个创建的实例被删除时,它必须从静态列表中删除

而finalizer方法,必须使用'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__()

错误如下:

异常被忽略:del at 0x0000028A3675EF70>

Traceback(最近一次调用最后一次): del 中的文件“(Path)\temp.py”,第 11 行 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 ma​​in.Staff 对象位于 0x000001FF7506CFD0>

a_staff ma​​in.Staff 对象位于 0x000001FF7506CFD0>

实例的内存地址完全一样,但不知道为什么解释器说静态列表中没有实例。

当我在 Java 中运行类似的代码时没有问题。

为什么会出现错误?

【问题讨论】:

  • 你想要完成什么?将 Staff 对象的实例保存在列表中,然后在删除实例时将其从列表中删除?
  • @DanielButler 感谢您的回答!是的,没错。如果创建了新实例,则必须将该实例添加到静态列表中。并且当一个创建的实例被删除时,它必须从静态列表中删除。

标签: python static instance


【解决方案1】:

注意

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__ 重命名为删除。您可以尝试解释上面的documentation,其中指出

由于调用 del() 方法的不稳定环境,在其执行期间发生的异常将被忽略,并且会向 sys.stderr 打印警告。

以上引用解释了您的错误。然而,正如other posts 的大纲,__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

所以项目被删除,你的文本被打印出来,无一例外!

【讨论】:

  • 感谢您的回答!我了解到您的方法效果很好。但是必须使用终结器方法(__del__())...
  • @JEONOUS 查看我的编辑,因为它可能对你更有用
  • 感谢您再次回复。但我有一个问题。在python中,我可以检查静态列表中存在的实例,但是为什么我不能用remove()删除它?
  • 您的回答很完美,我理解。其实这里虽然没有写出原因,但是我应该删除__del__()里面的静态列表的实例。
  • @JEONOUS 最后一点,当您覆盖__del__() 时,您定义的是del。你应该使用del。就像你写 len(Staff.staffs) 而不是 Staff.staffs.__len__()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多