Python объект удаляет себя - PullRequest
56 голосов
/ 16 ноября 2008

Почему это не сработает? Я пытаюсь сделать экземпляр класса удалить себя.

>>> class A():
    def kill(self):
        del self


>>> a = A()
>>> a.kill()
>>> a
<__main__.A instance at 0x01F23170>

Ответы [ 13 ]

0 голосов
/ 29 октября 2018
class A:
  def __init__(self, function):
    self.function = function
  def kill(self):
    self.function(self)

def delete(object):                        #We are no longer in A object
  del object

a = A(delete)
print(a)
a.kill()
print(a)

Может ли этот код работать?

0 голосов
/ 25 марта 2015

что вы можете сделать, это взять имя с собой в классе и сделать словарь:

class A:
  def __init__(self, name):
    self.name=name
  def kill(self)
    del dict[self.name]

dict={}
dict["a"]=A("a")
dict["a"].kill()
0 голосов
/ 16 ноября 2008

Мне любопытно, почему вы хотели бы сделать такую ​​вещь. Скорее всего, вы должны просто позволить сборке мусора делать свою работу. В python сборка мусора довольно детерминирована. Таким образом, вам не нужно беспокоиться о том, чтобы просто оставлять объекты в памяти, как это было бы на других языках (не говоря о том, что пересчет не имеет недостатков).

Хотя одна вещь, которую вам следует учитывать, - это обертка вокруг любых объектов или ресурсов, от которых вы можете избавиться позже.

class foo(object):
    def __init__(self):
        self.some_big_object = some_resource

    def killBigObject(self):
        del some_big_object

В ответ на дополнение Null :

К сожалению, я не верю, что есть способ сделать то, что ты хочешь сделать так, как ты хочешь. Вот один из способов, который вы можете рассмотреть:

>>> class manager(object):
...     def __init__(self):
...             self.lookup = {}
...     def addItem(self, name, item):
...             self.lookup[name] = item
...             item.setLookup(self.lookup)
>>> class Item(object):
...     def __init__(self, name):
...             self.name = name
...     def setLookup(self, lookup):
...             self.lookup = lookup
...     def deleteSelf(self):
...             del self.lookup[self.name]
>>> man = manager()
>>> item = Item("foo")
>>> man.addItem("foo", item)
>>> man.lookup
 {'foo': <__main__.Item object at 0x81b50>}
>>> item.deleteSelf()
>>> man.lookup
 {}

Это немного грязно, но это должно дать вам идею. По сути, я не думаю, что связывание существования предмета в игре с тем, находится ли он в памяти или нет, является хорошей идеей. Это потому, что условия для предмета, подлежащего уборке мусора, вероятно, будут отличаться от условий для предмета в игре. Таким образом, вам не нужно так сильно беспокоиться об этом.

...