控制对象销毁顺序的最佳实践一通过函数控制

控制对象销毁顺序的最佳实践一

  1. 通过函数控制.

  2. 在 if __name__ == '__main__': pass 代码块,实例化对象,然后由解释器优化的对象销毁逻辑控制,如果不清楚解释器的对象销毁逻辑,那么销毁对象的顺序是不可控的(程序员不可控)

1.通过函数控制.

class A(object):
    def __init__(self):
        print(f"Initializing {self}")
        
    def __del__(self):
        print(f"Releasing {self}")
        
        
class B(object):
    def __init__(self):
        print(f"Initializing {self}")
    
    def __del__(self):
        print(f"Releasing {self}")


class C(object):
    def __init__(self):
        print(f"Initializing {self}")
    
    def __del__(self):
        print(f"Releasing {self}")


class D(object):
    def __init__(self, a, b):
        print(f"Initializing {self}")
        self.a = a
        self.b = b
    
    def __del__(self):
        # del self.a
        # del self.b
        print(f"Releasing {self}")


class E(object):
    def __init__(self, a):
        print(f"Initializing {self}")
        self.a = a
    
    def __del__(self):
        # del self.a
        print(f"Releasing {self}")


class F(object):
    def __init__(self, a, b):
        print(f"Initializing {self}")
        self.a = a
        self.b = b
    
    def __del__(self):
        # del self.a
        # del self.b
        print(f"Releasing {self}")
        

class Control(object):
    def __init__(self):
        print(f'Initializing {self}')
        self.a = A()
        self.b = B()
        self.c = C()
        self.f = F(self.a, self.b)
        self.d = D(self.a, self.b)
        self.e = E(self.a)

    def start_test(self):
        print(f'{self} is testing')
    
    def __del__(self):

        print(f"Releasing {self}")
    
        
def test():
    control = Control()
    control.start_test()

    
if __name__ == '__main__':
    print(test())
    print('finished')

 test()函数调用返回之前会del control, control对象的引用标识只有唯一的control,所以此时调用control对象的__del__()方法,所以看到了Releasing <__main__.Control object at 0x000002834B413D90>打印, 再进而真正去销毁control对象, control对象的属性标识self.a引用了A()对象, self.b引用了B()对象, self.c引用了C()对象, self.d引用了D()对象, self.e引用了E()对象, self.f引用了F()对象

posted @ 2023-10-19 00:19  fangpinz  阅读(24)  评论(0)    收藏  举报