对 python 类声明周期的理解

2020-09-10  本文已影响0人  天空蓝雨

先来个简单的例子:

class xx():
    def __new__(cls, *args, **kwargs):
        print("实例穿件")
        return super(xx, cls).__new__(cls, *args, **kwargs)
        
    def __init__(self, *args, **kwargs):
        print("实例初始化")
    
    
    def __del__(self, *args):
        print("实例被删除了")
        
a = xx()
实例穿件
实例初始化
del a
实例被删除了

注意:上面是在 jupyter 里面测试的,所以需要手动 del a ,实例才会被删除的。
另一种情况,就是 在 ide 中,如下图:


ide 文件运行后,会自动回收实例的 a, 那实例没有引用也就自然被删除了 直接执行实例,但是没有被引用,那就立刻被删除了

从这点就看出来了,实例的声明周期遵守 python 引用计数和 隔代回收的原则的。
参考理解:
https://segmentfault.com/q/1010000015687362
其实我们可以通过实例的 id ,来使用他,前提是,这个实例还没有会回收

id = id(xx对象)
_ctypes.PyObj_FromPtr(id)  # 拿到 id 对应的对象

所以,如果缓存session 存不了 实例(因为无法序列化),也许可以考虑使用 保存实例的id(数字喽)。(嘿嘿,可以试试)

總結,儅實力沒有被回收的時候,是可以通過id 來獲取到的,

如果實力不存在的話,調用會返回一個錯誤的狀態嗎, 而不通常的 0,并且不可以使用這個實力了。

上一篇 下一篇

猜你喜欢

热点阅读