Я не понимаю этого поведения python __del__

Кто-нибудь может объяснить, почему следующий код ведет себя именно так:

import types

class Dummy():
    def __init__(self, name):
        self.name = name
    def __del__(self):
        print "delete",self.name

d1 = Dummy("d1")
del d1
d1 = None
print "after d1"

d2 = Dummy("d2")
def func(self):
    print "func called"
d2.func = types.MethodType(func, d2)
d2.func()
del d2
d2 = None
print "after d2"

d3 = Dummy("d3")
def func(self):
    print "func called"
d3.func = types.MethodType(func, d3)
d3.func()
d3.func = None
del d3
d3 = None
print "after d3"

Вывод (обратите внимание, что деструктор для d2 никогда не вызывается) следующий (python 2.7)

delete d1
after d1
func called
after d2
func called
delete d3
after d3

Есть ли способ «исправить» код так, чтобы деструктор вызывался без удаления добавленного метода? Я имею в виду, что лучше всего поместить d2.func = None в деструктор!

Спасибо

def __init __ (self, name): self.name = name def __del __ (self): print "delete", ...

Может кто-нибудь объяснить, почему следующий код ведет себя именно так:

import types

class Dummy():
    def __init__(self, name):
        self.name = name
    def __del__(self):
        print "delete",self.name

d1 = Dummy("d1")
del d1
d1 = None
print "after d1"

d2 = Dummy("d2")
def func(self):
    print "func called"
d2.func = types.MethodType(func, d2)
d2.func()
del d2
d2 = None
print "after d2"

d3 = Dummy("d3")
def func(self):
    print "func called"
d3.func = types.MethodType(func, d3)
d3.func()
d3.func = None
del d3
d3 = None
print "after d3"

Вывод (примечание что деструктор для d2 никогда не вызывается) это (python 2.7)

delete d1
after d1
func called
after d2
func called
delete d3
after d3

Есть ли способ «исправить» код, чтобы деструктор вызывался без удаления добавленного метода? Я имею в виду, что лучше всего поместить d2.func = None в деструктор!

Спасибо

def __init __ (self, name): self.name = name def __del __ (self): print "delete", ...

Может кто-нибудь объяснить, почему следующий код ведет себя именно так:

import types

class Dummy():
    def __init__(self, name):
        self.name = name
    def __del__(self):
        print "delete",self.name

d1 = Dummy("d1")
del d1
d1 = None
print "after d1"

d2 = Dummy("d2")
def func(self):
    print "func called"
d2.func = types.MethodType(func, d2)
d2.func()
del d2
d2 = None
print "after d2"

d3 = Dummy("d3")
def func(self):
    print "func called"
d3.func = types.MethodType(func, d3)
d3.func()
d3.func = None
del d3
d3 = None
print "after d3"

Вывод (примечание что деструктор для d2 никогда не вызывается) это (python 2.7)

delete d1
after d1
func called
after d2
func called
delete d3
after d3

Есть ли способ «исправить» код, чтобы деструктор вызывался без удаления добавленного метода? Я имею в виду, что лучше всего поместить d2.func = None в деструктор!

Спасибо

[править] Основываясь на нескольких первых ответах, я хотел бы пояснить, что я не спрашиваю о достоинствах (или их отсутствии) использования __ del __ . Я попытался создать самую короткую функцию, которая демонстрировала бы то, что я считаю неинтуитивным. Я предполагаю, что была создана круговая ссылка, но не знаю почему. Если возможно, я хотел бы знать, как избежать циклической ссылки ....

33
задан pppery 6 August 2017 в 13:44
поделиться