how to achive - file write open on __del__?

后端 未结 4 524
予麋鹿
予麋鹿 2021-01-22 18:40

I m trying to do a some activity on class obj destruction. How do I achive file open in _del__ function? (I m using Python 3.4)

class iam(object):

    def __in         


        
相关标签:
4条回答
  • 2021-01-22 19:16

    Below is an alternate I used - Using atexit handlers:

    import atexit
    
    
    class iam(object):
    
        def __init__(self):
            print("I m born")
            atexit.register(self.cleanup)
    
        def cleanup(self):
            f = open("memory_report.txt", "w")
            f.write("He gone safe")
            f.close()
            print ("Done")
    
    
    if __name__ == '__main__':
        i = iam()
        print("Script Ends. Now to GC clean memory")
    

    Output:

    I m born
    Script Ends. Now to GC clean memory
    Done
    
    0 讨论(0)
  • 2021-01-22 19:34

    Below code is work fine.

    class iam(object):
    
    def __init__(self):
        print("I m born")
    
    def __del__(self):
        #"open" function still in __builtins__ 
        f = open("memory_report.txt", "w")
        f.write("He gone safe")
        f.close()
    
    def write_iam():
            i=iam()
    
    if __name__ == '__main__':
        write_iam()
        print("Script Ends. Now to GC clean memory")
    

    In this case:

    class iam(object):
    
    def __init__(self):
        print("I m born")
    
    def __del__(self):
        #__builtins__.open  has remove 
        f = open("memory_report.txt", "w")
        f.write("He gone safe")
        f.close()
    
    if __name__ == '__main__':
        i = iam()
        print("Script Ends. Now to GC clean memory")
    

    When exit the __main__ function, before GC delete the "i" instance (execute i.__delete__) "open" function has remove from __builtins__.

    0 讨论(0)
  • 2021-01-22 19:35

    The problem is, as MuSheng tried to explain, that the __builtins__ are removed before your __del__ is called.

    You can trigger the __del__ yourself by assigning None to the variable.

    MuSheng's code could be this:

    class iam():
        def __init__(self):
            print("I m born")
    
        def __del__(self):
            #"open" function still in __builtins__ 
            with open("memory_report.txt", "w") as f:
                f.write("He gone safe")
    
    if __name__ == '__main__':
        i = iam()
        i = None # This triggers `__del__`
        print("Script Ends. Now to GC clean memory")
    

    MuSheng deserves some upvotes, IMO

    0 讨论(0)
  • 2021-01-22 19:36

    As others have mentioned, don't use the ____del___ method to perform such cleanup. Instead, use either contextmanagers (with-statement) or register atexit-handlers.

    0 讨论(0)
提交回复
热议问题