В Python 2.x я должен вызывать объект .__ del__? - PullRequest
3 голосов
/ 17 ноября 2010

В Python 3.x все классы являются подклассами object.В 2.x вы должны явно указать class MyClass(object).И, поскольку я пытаюсь написать как можно больше 3.x совместимого кода, я создаю подкласс object.

В моей программе я использую метод __del__, и я хотел знать, должен ли я звонить object.__del__(self), или это волшебным образом решено?

Спасибо,Уэйн

РЕДАКТИРОВАТЬ: Кажется, есть некоторая путаница, что я имею в виду - в документах, которые он заявляет:

Если базовый класс имеет метод __del__(), производный класс __del__() метод, если таковой имеется, должен явно вызывать его, чтобы обеспечить надлежащее удаление части экземпляра базового класса.

Поэтому я хотел знать, нужно ли мне:

def __del__(self):
    object.__del__(self)

или какая-нибудь подходящая альтернатива.

Ответы [ 3 ]

4 голосов
/ 17 ноября 2010

Проверьте http://docs.python.org/reference/datamodel.html#basic-customization и http://docs.python.org/library/gc.html#module-gc. Вам не нужно вызывать метод __del__ для вашего объекта, потому что сборщик мусора должен сделать это за вас. Просто напишите правильный __del__ метод, и Python позаботится об этом за вас.

4 голосов
/ 17 ноября 2010

__del__ не предназначено для вызова. Деструкторы выполняются автоматически, когда объект больше не имеет ссылок и собирается.

И наоборот, вы не вызываете __init__, но об этом автоматически заботятся при создании объекта. Вызов __del__ не разрушит объект, и это может фактически привести к неожиданному поведению.

2 голосов
/ 17 ноября 2010

Ну, на самом деле object не имеет метода __del__, так что нет, вам не нужно его вызывать.

>>> object().__del__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute '__del__'
...