📅  最后修改于: 2020-04-07 11:05:29             🧑  作者: Mango
前提要求:Python中的构造函数
销毁对象时调用析构函数。在Python中,不需要使用C++中的析构函数,因为Python具有自动处理内存管理的垃圾收集器。
在__ del __()方法是一种公知的作为在Python析构函数方法。当所有对对象的引用都已删除时,即垃圾回收对象时,将调用该方法。
析构函数声明的语法:
def __del __():
#析构体
示例1:这是析构函数的简单示例。通过使用del关键字,我们删除了对象’obj’的所有引用,因此自动调用了析构函数。
# Python调用析构函数
class Employee:
# 初始化
def __init__(self):
print('Employee被创建.')
# 删除 (调用析构函数)
def __del__(self):
print('析构函数被调用, Employee被删除.')
obj = Employee()
del obj
输出:
Employee被创建.
析构函数被调用, Employee被删除.
注意:在程序结束后或删除对对象的所有引用时,即在引用计数变为零时(而不是在对象超出范围时),将调用析构函数。
示例2:此示例给出了上述注释的说明。在这里,请注意,在打印“ Program End…”之后将调用析构函数。
# Python程序展示析构函数
class Employee:
# 初始化
def __init__(self):
print('Employee被创建')
# Calling destructor
def __del__(self):
print("Destructor被调用")
def Create_obj():
print('创建对象...')
obj = Employee()
print('函数结束...')
return obj
print('调用Create_obj()函数...')
obj = Create_obj()
print('程序结束...')
输出:
调用Create_obj()函数...
创建对象...
Employee被创建
函数结束...
程序结束...
Destructor被调用
示例3:现在,考虑以下示例:
# Python展示析构函数
class A:
def __init__(self, bb):
self.b = bb
class B:
def __init__(self):
self.a = A(self)
def __del__(self):
print("die")
def fun():
b = B()
fun()
输出:
die
在此示例中,当调用函数fun()时,它将创建类B的实例,该实例将自身传递给类A,然后将其设置为对类B的引用并产生循环引用。
通常,用于检测这些类型的循环引用的Python垃圾回收器会将其删除,但是在本示例中,使用自定义析构函数将该项目标记为“无法收集”。
简而言之,它不知道销毁对象的顺序,因此将其留下。因此,如果您的实例涉及循环引用,则它们将在应用程序运行期间一直存在于内存中。