Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python 객체를 올바르게 정리하려면 어떻게 해야 합니까?


전역을 없음으로 설정하여 정리합니다. 지역 주민들은 세션이 끝나면 자폭합니다. 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()와 같은 명시적 종료자 메서드를 사용합니다.

  • 약한 참조를 사용하십시오.