Удаление класса в cmd, но не в IDLE - PullRequest
0 голосов
/ 08 января 2012

Когда я запускаю этот код в командной строке, созданное мной Person автоматически удаляется, но в режиме IDLE удаление не происходит. Почему?

ПРИМЕЧАНИЕ: это программа, которая должна создавать адресную книгу (список словарей)

Вот мой код: list = []

class bookEntry(dict):
    total = 0

    def __init__(self):
        bookEntry.total += 1
        self.d = {}

    def __del__(self):
        bookEntry.total -= 1
        list.remove(self)

class Person(bookEntry):
    def __init__(self, n):
        bookEntry.__init__(self)
        self.n = n
        print '%s has been created' % (self.n)

    def __del__(self):
        print '%s has been deleted' % (self.n)

    def addnewperson(self, n, e = '', ph = '', note = ''):
        self.d['name'] = n
        self.d['email'] = e
        self.d['phone'] = ph
        self.d['note'] = note

        list.append(self)

Я запускаю код с функцией startup:

def startup():
    aor = raw_input('Hello! Would you like to add an entry or retrieve one?')
    if aor == 'add':
        info = raw_input('Would you like to add a person or a company?')
        if info == 'person':
            n = raw_input('Please enter this persons name:')
            e = raw_input('Please enter this persons email address:')
            ph = raw_input('Please enter this persons phone number:')
            note = raw_input('Please add any notes if applicable:')

            X = Person(n)
            X.addnewperson(n, e, ph, note)
startup()

Когда код выполняется в IDLE, я получаю следующие подсказки и отправляю следующие ответы:

'''
    Hello! Would you like to add an entry or retrieve one?add
    Would you like to add a person or a company?person
    Please enter this persons name:Pig
    Please enter this persons email address:pig@brickhouse.com
    Please enter this persons phone number:333-333-3333
    Please add any notes if applicable:one of three
    Pig has been created
'''

Здесь, Свинья создается и не удаляется. Но в cmd .....

'''
    Hello! Would you like to add an entry or retrieve one?add
    Would you like to add a person or a company?person
    Please enter this persons name:Pig
    Please enter this persons email address:pig@brickhouse.com
    Please enter this persons phone number:333-333-3333
    Please add any notes if applicable:one of three
    Pig has been created
    Pig has been deleted
'''

Почему Свинья удаляется ?? __del__ никогда не называется ...

Ответы [ 2 ]

1 голос
/ 08 января 2012

Пока вы работаете в IDLE, процесс python все еще выполняется даже после запуска этой программы, если вы не выйдете из IDLE.Но в командной строке процесс python выполняет вашу программу и завершает свою работу.Вот где __del__ вступает в игру.Когда счетчик ссылок на объект равен нулю, он автоматически вызывается для его уничтожения.поэтому ваш объект удален.Когда ваша программа завершена и сам процесс Python завершен, нет необходимости в том, что он также существует.

Ссылка

0 голосов
/ 08 января 2012

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

Примечание: Мой первоначальный ответ был ошибочным - я пропустил строки

list = []

и

list.append(self)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...