Как работают конструкторы и деструкторы? - PullRequest
3 голосов
/ 12 марта 2010

Я пытаюсь понять этот код:

class Person:
    '''Represents a person '''
    population = 0

    def __init__(self,name):
          //some statements and population += 1
    def __del__(self):
          //some statements and population -= 1 
    def sayHi(self):
        '''grettings from person'''
        print 'Hi My name is %s' % self.name

    def howMany(self):
        '''Prints the current population'''
        if Person.population == 1:
            print 'i am the only one here'
        else:
            print 'There are still %d guyz left ' % Person.population
rohan = Person('Rohan')
rohan.sayHi()
rohan.howMany()


sanju = Person('Sanjivi')
sanju.howMany()

del rohan # am i doing this correctly? 

Как вызывается деструктор - автоматически или мне нужно что-то добавить в "основную" программу / класс, как указано выше?

Выход:

Инициализация персональных данных
******************************************
Инициализация Рохана
******************************************
Население сейчас составляет: 1
Привет, меня зовут Рохан
я единственный здесь
Инициализация персональных данных
******************************************
Инициализация Сандживи
******************************************
Население сейчас составляет: 2
В случае смерти человека:
******************************************
Sanjivi Bye Bye world
осталось еще 1 человек
я единственный здесь
В случае смерти человека:
******************************************
Rohan Bye Bye world
я последний человек на земле
Население сейчас составляет: 0

При необходимости я могу вставить также весь урок. Я учусь у: http://www.ibiblio.org/swaroopch/byteofpython/read/

Ответы [ 2 ]

16 голосов
/ 12 марта 2010

Вот слегка мнительный ответ.

Не используйте __del__. Это не C ++ или язык, созданный для деструкторов. Метод __del__ действительно должен отсутствовать в Python 3.x, хотя я уверен, что кто-то найдет вариант использования, который имеет смысл. Если вам нужно использовать __del __, помните об основных ограничениях на http://docs.python.org/reference/datamodel.html:

  • __del__ вызывается, когда сборщик мусора собирает объекты, а не когда вы теряете последнюю ссылку на объект и не при выполнении del object.
  • __del__ отвечает за вызов любого __del__ в суперклассе, хотя это не так. очистить, если это в порядке разрешения методов (MRO) или просто вызывать каждый суперкласс.
  • Наличие __del__ означает, что сборщик мусора прекращает обнаружение и очистку любых циклических ссылок, таких как потеря последней ссылки на связанный список. Вы можете получить список игнорируемых объектов из gc.garbage. Иногда вы можете использовать слабые ссылки, чтобы вообще избежать цикла. Это обсуждается время от времени: см. http://mail.python.org/pipermail/python-ideas/2009-October/006194.html.
  • Функция __del__ может обманывать, сохранять ссылку на объект и останавливать сборку мусора.
  • Исключения, явно заданные в __del__, игнорируются.
  • __del__ дополняет __new__ гораздо больше, чем __init__. Это сбивает с толку. См. http://www.algorithm.co.il/blogs/index.php/programming/python/python-gotchas-1-del-is-not-the-opposite-of-init/ для объяснения и ошибок.
  • __del__ не «любимый» ребенок в Python. Вы заметите, что документация sys.exit () не указывает, собирается ли мусор перед выходом, и есть много странных проблем. Вызов __del__ для глобалов вызывает странные проблемы с порядком, например, http://bugs.python.org/issue5099. Должен ли __del__ вызываться, даже если __init__ не удается? Смотрите http://mail.python.org/pipermail/python-dev/2000-March/thread.html#2423 для длинной нити.

Но, с другой стороны:

  • __del__ означает, что вы не забудете позвонить с близким оператором Смотрите http://eli.thegreenplace.net/2009/06/12/safely-using-destructors-in-python/ для точной __del__ точки зрения. Обычно речь идет об освобождении ctypes или другого специального ресурса.

И моя причина не нравиться функции __del__.

  • Каждый раз, когда кто-то воспитывает __del__, он превращается в тридцать сообщений путаницы.
  • Это разбивает эти предметы в дзен питона:
    • Комплекс лучше, чем сложный.
    • Особых случаев недостаточно, чтобы нарушать правила.
    • Ошибки никогда не должны проходить бесшумно.
    • Перед лицом двусмысленности откажитесь от искушения угадать.
    • Должен быть один - и желательно только один - очевидный способ сделать это.
    • Если реализацию сложно объяснить, это плохая идея.

Итак, найдите причину не использовать __del__.

1 голос
/ 12 марта 2010

Как я понял из моего раннего опыта CPTS:

Конструкторы: Конструкторы в основном используются в классах для инициализации класса значениями и дают возможность выполнять некоторые фоновые работы на основе создания. Если вы передаете значения во время создания объекта, именно здесь вы можете обрабатывать присвоение этих значений переменным в вашем классе. (В этом случае при построении вы увеличиваете переменную, которая отслеживает население).

Деструкторы: Деструкторы очищают класс. В python из-за сборщика мусора это не так важно, как языки, которые могут оставлять висячие указатели (c ++). (В этом случае вы уменьшаете популяционную переменную при уничтожении объекта).

...