전역을 없음으로 설정하여 정리합니다. 지역 주민들은 세션이 끝나면 자폭합니다. Python에서 호출한 __del__ 함수는 전역을 None으로 설정합니다.
주어진 클래스의 모든 객체를 정리하는 다음 코드를 고려하십시오 -
예시
class Counter: Count = 0 # This is the count of objects of this class def __init__(self, name): self.name = name print name, 'created' Counter.Count += 1 def __del__(self): print self.name, 'deleted' Counter.Count -= 1 if Counter.Count == 0: print 'Last Counter object deleted' else: print Counter.Count, 'Counter objects remaining' x = Counter("First") del x
마지막 del이 없으면 예외가 발생합니다.
__del__에 관한 Python 문서에서 −
경고:__del__() 메서드가 호출되는 불안정한 상황으로 인해 실행 중에 발생하는 예외는 무시되고 대신 sys.stderr에 경고가 출력됩니다. 또한 모듈 삭제에 대한 응답으로 __del__()이 호출되면(예:프로그램 실행이 완료될 때) __del__() 메서드에서 참조하는 다른 전역이 이미 삭제되었을 수 있습니다. 이러한 이유로 __del__() 메서드는 외부 불변성을 유지하는 데 필요한 최소한의 작업을 수행해야 합니다.
del에 대한 명시적 호출이 없으면 __del__은 프로그램 끝에서만 호출되고 Counter 및/또는 Count는 __del__이 호출될 때 이미 GC 처리되었을 수 있습니다(객체 수집 순서는 결정적이지 않음). 예외는 카운터가 이미 수집되었음을 의미합니다. __del__에서는 특별히 멋진 것을 할 수 없습니다.
여기에 두 가지 가능한 솔루션이 있습니다.
-
파일 객체에 대해 close()와 같은 명시적 종료자 메서드를 사용합니다.
-
약한 참조를 사용하십시오.