当我尝试删除一个类的一个实例时,它会导致另一个实例的__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!"
?
答案 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}}