Python中的析构函数
Python中的构造函数
当对象被销毁时,会调用析构函数。在Python中,不像在 C++ 中那样需要析构函数,因为Python有一个自动处理内存管理的垃圾收集器。
__ del __()方法在Python中被称为析构函数。当对对象的所有引用都被删除时调用它,即当一个对象被垃圾回收时。
析构函数声明的语法:
def __del__(self):
# body of destructor
注意:当对象失去引用或程序结束时,对对象的引用也会被删除。
示例 1:这是析构函数的简单示例。通过使用 del 关键字,我们删除了对象 'obj' 的所有引用,因此自动调用了析构函数。
Python3
# Python program to illustrate destructor
class Employee:
# Initializing
def __init__(self):
print('Employee created.')
# Deleting (Calling destructor)
def __del__(self):
print('Destructor called, Employee deleted.')
obj = Employee()
del obj
Python3
# Python program to illustrate destructor
class Employee:
# Initializing
def __init__(self):
print('Employee created')
# Calling destructor
def __del__(self):
print("Destructor called")
def Create_obj():
print('Making Object...')
obj = Employee()
print('function end...')
return obj
print('Calling Create_obj() function...')
obj = Create_obj()
print('Program End...')
Python3
# Python program to illustrate destructor
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()
输出:
Employee created.
Destructor called, Employee deleted.
注意:析构函数是在程序结束或对象的所有引用被删除时调用的,即引用计数变为零时调用,而不是在对象超出范围时调用。
例2:这个例子给出了上面提到的注释的解释。在这里,请注意析构函数是在打印“程序结束...”之后调用的。
Python3
# Python program to illustrate destructor
class Employee:
# Initializing
def __init__(self):
print('Employee created')
# Calling destructor
def __del__(self):
print("Destructor called")
def Create_obj():
print('Making Object...')
obj = Employee()
print('function end...')
return obj
print('Calling Create_obj() function...')
obj = Create_obj()
print('Program End...')
输出:
Calling Create_obj() function...
Making Object...
Employee created
function end...
Program End...
Destructor called
示例 3:现在,考虑以下示例:
Python3
# Python program to illustrate destructor
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 垃圾收集器会将其删除,但在此示例中,使用自定义析构函数将此项标记为“不可回收”。
简单地说,它不知道销毁对象的顺序,所以它离开了它们。因此,如果您的实例涉及循环引用,只要应用程序运行,它们就会一直存在于内存中。