【问题标题】:How can I delete an instance of a class within that class?如何删除该类中的类的实例?
【发布时间】:2018-04-08 21:05:27
【问题描述】:

我想知道如何删除类中的实例。我正在尝试del self,但它似乎不起作用。这是我的代码:

class Thing:

    def __init__(self):
        self.alive = True
        self.age = 0

    def update(self):
        self.age += 1

    def kill(self):
        if self.age >= 10:
            del self

    def all(self):
        self.update()
        self.kill()

things =  []

for i in range(0, 10):
    thing.append(Thing())

while True:
    for thing in things:
        thing.all()

我特别想删除类中的实例。我也把del self换成了self = None,但是这个说法好像没有任何效果。我怎样才能做到这一点?

【问题讨论】:

  • 如果您可以“删除”一个实例,您认为当前持有该实例的变量会发生什么?应该将它们设置为None 还是什么?您在这里尝试做的事情没有任何意义。如果您想从things 列表中删除该实例,这很容易且可行。但是你不能在它仍然从其他地方(例如你的things列表)引用的时候完全删除一个对象。
  • @Aran-Fey 我认为它应该具有与del 类似的效果。它应该使保存实例的变量未定义。因此,如果我在删除其中的所有内容后打印things 列表,它将给出以下输出:[]
  • 为什么要删除它?在我看来,当age>=10 时,您需要一个属性inactive,即True,这是一个类级别的问题。另一方面,del 管理内存中的项目。您要求垃圾收集器为您进行应用程序级对象管理。
  • 实例不知道它是列表的成员。
  • del 不是这样工作的。 del 删除变量而不是对象。 IOW 考虑,x = 42; y = []; y.append(x); del x; print(y)

标签: python python-3.x


【解决方案1】:

你不能完全按照你的要求去做。 Python 的del 语句不能这样工作。但是,您可以做的是将您的实例标记为已死(您已经有一个属性!),然后过滤对象列表以删除死对象:

class Thing:
    def __init__(self):
        self.alive = True   # use this attribute!
        self.age = 0

    def update(self):
        self.age += 1

    def kill(self):
        if self.age >= 10:
            self.alive = False  # change it's value here rather than messing around with del

    def all(self):
        self.update()
        self.kill()

things =  []

for i in range(0, 10):
    things.append(Thing())

while True:
    for thing in things:
        thing.all()

    things = [thing for thing in things if thing.alive] # filter the list

请注意,即使在所有 Thing 实例都死了之后,此代码末尾的循环也会永远运行而没有输出。您可能想要修改它以便知道发生了什么,或者甚至更改while 循环以检查things 中是否还有任何对象。使用while things 而不是while True 可能是一种合理的方法!

【讨论】:

    【解决方案2】:

    我上次也遇到了同样的麻烦。我搜索了一些答案并得到了一个。您可以使用self.__delete__()。这个有两个下划线的delete方法只能删除一个对象,所以你很好!!!

    【讨论】:

    • __delete__ 方法是描述符协议的一部分。在这种情况下,它不能满足提问者的要求。
    猜你喜欢
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    相关资源
    最近更新 更多