본문 바로가기
Python Object-oriented Programming

__del__ Method

by 자동매매 2023. 4. 4.

출처 : https://www.pythontutorial.net/python-oop/python-__del__/

 

Python __del__

In this tutorial, you will learn about the Python __del__ special method and understand how it works.

www.pythontutorial.net

 

Introduction to the Python __del__ method

 

Python에서 garbage collector(가비지 수집기) 메모리를 자동으로 관리합니다. 가비지 수집기는 참조되지 않은 개체를 삭제합니다.

객체가 __del__ 메서드를 구현하는 경우  Python은  가비지 수집기가 객체를 파괴하기 직전에 __del__ 메서드를 호출합니다.

그러나 가비지 수집기는 개체를 삭제할 시기를 결정합니다. 따라서 __del__ 메서드 호출되는 시기를 결정합니다.

 

__del__ class finalizer라고도 합니다. __del__destructor 아니다( 가비지 수집기가 개체를 파괴하기 때문이다)

 

The Python __del__ pitfalls

 

파이썬은  모든 객체 참조가 사라졌을 __del__ 메서드를 호출합니다. 그후 개체를 제어 없습니다.

따라서 __del__ 메서드를 사용하여 리소스를 정리하면 됩니다. context manager 사용하는 것이 좋습니다.

 

__del__메서드에 객체에 대한 참조가 포함되어 있으면 가비지 수집기는 __del__ 호출 이러한 객체도 파괴합니다.

__del__ 메서드가 global objects를 참조하는 경우 예기치 않은 동작이 발생할 있습니다.

__del__ 메서드 내에서 예외가 발생하면  Python 예외를 발생시키지 않고 침묵합니다.

또한 파이썬은 예외 메시지를 stderr 보냅니다. 따라서 프로그램은 마무리 과정에서 예외를 인식 있습니다.

 

실제로는 __del__ 메서드를 거의 사용하지 않습니다.

 

Python __del__ example

 

다음은  특별한 __del__ 메서드를  사용하여 Person  클래스를 정의하고, Person 인스턴스를 만들고, None으로 설정합니다.

 

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __del__(self):
        print('__del__ was called')


if __name__ == '__main__':
    person = Person('John Doe', 23)
    person = None

Output:

__del__ was called

 

person 개체를 None으로 설정하면 참조가 없기 때문에 가비지 수집기가 개체를 삭제합니다. 따라서 __del__ 메서드가 호출되었습니다.

del 키워드를 사용하여 person 개체를  삭제하는 경우 __del__ 메서드도 호출됩니다.

 

person = Person('John Doe', 23)
del person

Output:

__del__ was called

 

그러나 del 문은  개체에 참조가 있는 경우 __del__ 메서드를  호출하지 않습니다.

 

Summary

  • 파이썬은  garbage collector (가비지 수집기) 객체를 파괴하기 직전에 __del__ 메서드를 호출합니다.
  • garbage collector (가비지 수집기) 개체에 대한 참조 없는 경우 개체를 삭제합니다.  -> __del__method호출
  • __del__ 메서드 내부에서 예외가  발생하면 에러를 발생하지 않는다.
  • resources정리에 __del__ 사용하지 말고  대신 context manager(컨텍스트 관리자) 사용하십시오.
 

'Python Object-oriented Programming' 카테고리의 다른 글

readonly-property  (0) 2023.04.04
properties  (0) 2023.04.04
Dependency Inversion Principle  (0) 2023.04.04
__bool__ Method  (0) 2023.04.03
__hash__ Method  (0) 2023.04.03

댓글