Во время игры с OO Python я натолкнулся на следующее любопытство. Рассмотрим следующий простой класс:странное поведение деструктора python
>>> class Monty():
def __init__(self):
print 'start m'
def __del__(self):
print 'deleted m'
Инстанцирования объекта выходит, как и ожидался:
>>> a = Monty()
start m
>>> a
<__main__.Monty instance at 0x7fdf9f084830>
и теперь забавная часть:
>>> del a
>>> a = Monty()
start m
>>> a
deleted m
<__main__.Monty instance at 0x7fdf9f083fc8>
>>> a
<__main__.Monty instance at 0x7fdf9f083fc8>
>>> del a
>>> a = Monty()
start m
>>> del(a)
deleted m
>>> a = Monty()
start m
>>> a
deleted m
<__main__.Monty instance at 0x7fdf9f084830>
Запутанная частью здесь является то, что я получаю сообщение от деструктора с задержка. Мое понимание таково:
del a
Удаляет ссылку на объект, чтобы объект a оставался для сбора мусора. Но почему-то интерпретатор ждет с передачей сообщения на консоль.
Другой это разница между
del x
и
del(x)
, так как если вы запускали код, используя последнее только все идет, как и ожидалось - вы получите немедленную информацию от деструктора.
Это можно воспроизвести на Python 2.7, а также с использованием Python 3.3.
Пожалуйста, вы можете подробно остановиться на разнице между вызовом: дель X и называют: дель (X)? – data
@data: нет разницы. У вас есть 'del', за которым следует выражение *, создающее объект для удаления. '(..)' круглые скобки являются частью выражения. –
@data: Если вы считаете, что видите различия между поведением 'del X' и' del (X) ', эти различия были фактически вызваны тем, какое значение вы в конечном итоге вызывали для Python для хранения на' _'. – user2357112