Объект Python удаление себя

61
задан Sam 17 August 2014 в 15:39
поделиться

6 ответов

'сам' только ссылка на объект. 'del сам' удаляет 'сам' ссылка от локального пространства имен функции уничтожения вместо фактического объекта.

Для наблюдения этого для себя посмотрите на то, что происходит, когда эти две функции выполняются:

>>> class A():
...     def kill_a(self):
...         print self
...         del self
...     def kill_b(self):
...         del self
...         print self
... 
>>> a = A()
>>> b = A()
>>> a.kill_a()
<__main__.A instance at 0xb771250c>
>>> b.kill_b()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 7, in kill_b
UnboundLocalError: local variable 'self' referenced before assignment
68
ответ дан Jeremy Ruten 24 November 2019 в 17:07
поделиться

Вы не должны использовать del для удаления экземпляров во-первых. Как только последней ссылки на объект не стало, объект будет собран "мусор". Возможно, необходимо сказать нам больше о полной проблеме.

42
ответ дан Ned Batchelder 24 November 2019 в 17:07
поделиться

В этом определенном контексте Ваш пример не имеет много смысла.

, Когда Существо берет Объект, объект сохраняет отдельное существование. Это не исчезает, потому что это было взято. Это все еще существует, но это (a) в том же месте как Существо и (b) больше не имея право быть взятым. В то время как это имело изменение состояния, это все еще существует.

существует двухсторонняя ассоциация между Тем, чтобы быть и Объектом. У Существа есть Объект в наборе. Объект связан с Существом.

, Когда Объект взят Существом, две вещи должны произойти.

  • Существо, как добавляет Объект в [приблизительно 112] из объектов. Ваш bag атрибут, например, мог быть таким set. [list плохой выбор - действительно заказывает вопрос в сумке?]

  • местоположение Объекта изменяется от того, где оно раньше было к местоположению. Существует, вероятно, два класса Объекты OS - те с независимым смыслом местоположения (потому что они перемещаются собой), и объекты, которые должны делегировать местоположение Существу или Место, где они находятся.

Ни при каких обстоятельствах не делает объекта Python никогда потребность, которая будет удалена. Если объект "уничтожается", то это не находится в мешке. Это не находится в месте.

player.bag.remove(cat)

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

, С другой стороны,

here.add( cat )
player.bag.remove(cat)

поместит кошку в текущее местоположение. Кошка продолжает существовать и не будет расстроена с мусором.

13
ответ дан S.Lott 24 November 2019 в 17:07
поделиться

Действительно, Python делает сборку "мусора" посредством подсчета ссылок. Как только последняя ссылка на объект падает из объема, она удалена. В Вашем примере:

a = A()
a.kill()

я не полагаю, что существует любой путь к переменной для неявной установки ни к Одному.

1
ответ дан Cybis 24 November 2019 в 17:07
поделиться

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

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

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

    def killBigObject(self):
        del some_big_object

В ответ на приложение Пустого указателя:

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

>>> 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
 {}

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

0
ответ дан Community 24 November 2019 в 17:07
поделиться

Я не могу сказать вам, как это возможно с классами, но функции могут удалять себя.

def kill_self(exit_msg = 'killed'):
    global kill_self
    del kill_self
    return exit_msg

И посмотрите результат:

 >>> kill_self
<function kill_self at 0x02A2C780>
>>> kill_self()
'killed'
>>> kill_self
Traceback (most recent call last):
  File "<pyshell#28>", line 1, in <module>
    kill_self
NameError: name 'kill_self' is not defined

Я не думаю, что удаление отдельного экземпляра класса, не зная его имени, возможно.

ПРИМЕЧАНИЕ: Если вы присвоите функции другое имя, это имя по-прежнему будет ссылаться на старое, но вызовет ошибки при попытке его запуска:

>>> x = kill_self
>>> kill_self()
>>> kill_self
NameError: name 'kill_self' is not defined
>>> x
<function kill_self at 0x...>
>>> x()
NameError: global name 'kill_self' is not defined
3
ответ дан 24 November 2019 в 17:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: