分享

Python中

 lllsztz 2019-12-01
Python中 __call__() 与__del__() 方法详解

__call__() 方法

如果类中定义了__call__() 方法,那么该类的实例可以作为函数调用,也就是说,假如在Person类中实现如下方法:'def __call__(self, *args)' 。 若将Person 类的一个实例化对象赋值于person_info 变量。那么调用 'person_info.__call__(1,2)' 等同于调用 'person_info(1,2)' 。同时,使用 'person_info(1,2)' 这种调用方式不影响实例本身的生命周期(__call__()不影响一个实例的构造和析构)。

__call__()方法可以用来改变实例的内部成员的值,对于一些类的实例中需要频繁改变状态的场景,使用这种方式是一种比较优雅的做法。

Python中 __call__() 与__del__() 方法详解

执行上述代码,输出结果为:

Python中 __call__() 与__del__() 方法详解

__del__() 方法

Python 引用计数机制是实现垃圾回收的主要机制之一,当有一个变量引用该 Python 对象时,该对象引用计数为 1,当有两个变量引用该 Python 对象时,该对象引用计数为 2,依此类推,如果一个对象的引用计数变成了 0,则说明程序中不再有变量引用该对象,即不再需要该对象,因此 Python 就会回收该对象。

与__init__() 方法对应的是__del__() 方法,实例化对象时,Python解释器默认调用__init__() 方法对类实例对象进行初始化。当删除一个对象时,Python解释器也会默认调用一个方法,这个方法为__del__() 方法销毁类实例化对象,即在任何 Python 对象将要被系统回收之时,系统都会自动调用该对象的__del__() 方法。

Python中 __call__() 与__del__() 方法详解

上述代码,运行 'person_info = Person('Tom', 18)' 在内存中创建了一个 Person 类的实例化对象,并且让变量 person_info 引用该 Person类的实例化对象。'del person_info' 删除变量 person_info(删除 Person类的实例化对象的引用) , 此时内存中的 Person类的实例化对象没有任何变量对其引用,Python解析器就会回调 __del__() 方法,回收内存。执行上述代码,输出结果为:

Python中 __call__() 与__del__() 方法详解

当一个对象被垃圾回收时,Python 就会自动调用该对象的__del__()方法。需要注意的是,不要认为对一个变量执行__del__() 操作,该变量所引用的对象就会被回收,只有当对象的引用计数变成 0 时,该对象才会被回收。因此,如果一个对象有多个变量引用它,那么 del 其中一个变量是不会回收该对象的。代码示例如下:

Python中 __call__() 与__del__() 方法详解

上述代码中,person_info 和 person_info1 同时引用同一个Person类的实例化对象(同一个内存地址),执行 'del person_info' 删除 person_info 变量时,删除的是该变量对应的引用,此时由于内存中的 Person类的实例对象还在被 person_info1 变量引用,引用计数不为0,所以不会回收该内存(不会回调__del__()方法)。当再执行 'del person_info1' 删除 person_info1变量后,内存中的Person类的实例对象已经没有引用的变量,此时引用计数为0,解释器会对内存进行回收,回调__del__()方法,执行上述代码,输出结果为:

Python中 __call__() 与__del__() 方法详解

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多