출처 : https://www.pythontutorial.net/python-oop/python-__del__/
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 |
댓글