调用同一个类中的其他方法_Python中 __call__() 与__del__() 方法详解

e02d72f207af630a991f74a0692102af.png

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

c8fa1cdbbdc4a4fd2a5efd1d625699fb.png

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

5677bf67dff93ae25eb9209799a44476.png

__del__() 方法

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

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

93c076e3ccade89810ca0b6ca44128f0.png

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

b4b225b6b1dfc9724638a848f1370049.png

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

8ea307c0bab92c7fb6f3b31170e2f45a.png

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

a46282784f5b4da13ebe5269a3967a3f.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值