Деструктор в классе продолжает называть себя при использовании класса - PullRequest
0 голосов
/ 10 апреля 2020

Я запускаю этот код:

import random
class Pound:
    def __init__(self):
        self.value=1.00
        self.color="gold"
        self.num_ages=1
        self.diameter=22.5
        self.thickness=3.15
        self.heads=True
        self.num_pocket=10

    def __del__(self):
        print("Coin spent!")

    def rust(self):
        self.color="greenish"

    def clean(self):
        self.color="clean"

    def flip(self):
        heads_options=[True,False]
        choice=random.choice(heads_options)
        self.heads=choice

coin1=Pound()
print(coin1.value)

Когда я запускаю его в Python IDLE, у меня нет никаких проблем вообще. Но когда я запускаю его в ATOM (используя atom- python -run или пакет сценариев), он всегда показывает мне такой вывод:

1.0
Coin spent!

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

1 Ответ

4 голосов
/ 10 апреля 2020

В этом коде, когда интерпретируется как сценарий, объект выходит из области действия сразу после print, так как после этого программа завершается. __del__ вызывается в этом случае, потому что в этот момент "экземпляр собирается быть уничтоженным" ( документы ).

При запуске из REPL, хотя (как IDLE), он не выводит go из области видимости, пока вы не убьете REPL, поэтому __del__ не вызывается сразу.

Это ожидаемое поведение.


Также обратите внимание, Документы не предпочитают слово «деструктор»:

Это также называется финализатором или (ненадлежащим образом) деструктором.

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