📜  Python中的析构函数

📅  最后修改于: 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垃圾回收器会将其删除,但是在本示例中,使用自定义析构函数将该项目标记为“无法收集”。
简而言之,它不知道销毁对象的顺序,因此将其留下。因此,如果您的实例涉及循环引用,则它们将在应用程序运行期间一直存在于内存中。