📜  Python中的析构函数

📅  最后修改于: 2022-05-13 01:55:08.917000             🧑  作者: Mango

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 垃圾收集器会将其删除,但在此示例中,使用自定义析构函数将此项标记为“不可回收”。
简单地说,它不知道销毁对象的顺序,所以它离开了它们。因此,如果您的实例涉及循环引用,只要应用程序运行,它们就会一直存在于内存中。