删除对象时意外输出

时间:2015-01-20 14:12:31

标签: python python-3.x

当我尝试删除一个类的一个实例时,它会导致另一个实例的__del__方法的意外输出:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print('{0} has been born!'.format(self.name))

    def __str__(self):
        return '{0} is {1} years old'.format(self.name, self.age)

    def __del__(self):
        print('{0} is deleted!'.format(self.name))

p1 = Person("John", 20)
p2 = Person("Mary", 27)

print(p1)
print(p2)

del(p2)

输出是:

John has been born!
Mary has been born!
John is 20 years old
Mary is 27 years old
Mary is deleted!
John is deleted!

为什么"John is deleted!"

1 个答案:

答案 0 :(得分:2)

John因为脚本结束而被删除。此时清除所有模块全局变量。

为了清楚起见,del调用不是Mary来清除del__del__只是清除全局命名空间中的变量,而后者又将引用计数减少到该对象。一旦引用计数达到0,就会调用sys.modules方法,并从内存中清除对象。

但是你的脚本命名空间也是一个对象;它存储在__main__下的sys.modules下,一旦完成运行,Python解释器将退出并清除John中的所有模块。这会导致拒绝计数下降,对于print这意味着它也会被清除。

您可以在del(p2)之后添加print('Script complete') 语句:

is deleted!

,您会看到在Mary is deleted! Script complete John is deleted! 输出之间插入:

{{1}}