본문 바로가기
GPT모음집

파이썬 jupyter notebook 클래스 __del__ 사용

by dataart 2023. 9. 21.

파이썬 매직 메서드인 __del__ 사용은 어떻게 할까?

 

 

 

https://chat.openai.com/share/b08ea16c-3968-4581-a523-165aecd67196

 

ChatGPT

파이썬 클래스의 __del__ 메서드는 객체가 소멸될 때 호출되는 특수한 메서드입니다. __del__ 메서드는 객체가 더 이상 참조되지 않을 때 자동으로 호출되며, 객체가 가비지 컬렉션될 때 주로 사용

chat.openai.com

 

메서드를 직접 호출하지 말고

del 객체

형태로 코드를 실행하면 된다고 한다. 잘 안쓰지만 알아두자.

 

그런데 __del__에서 코드를 정의하고, jupyter notebook 에서 여러번 사용하면

del 객체 형태의 코드를 실행하지 않아도 __del__ 메서드에서 정의한 코드가 실행되는 이상한 것을 볼 수 있다.

 

https://chat.openai.com/share/d8deffae-4ed3-4693-ab6b-3fa45cbd8957

 

ChatGPT

from time import ctime class The_Home: # 인스턴스 생성 시점의 초기 설정값 colorRoof = 'red' stateDoor = 'closed' # Constructor def __init__(self, name): self.Name = name def __del__(self): print("Destroyed") # 인스턴스에서 사용하는

chat.openai.com

 

__del__ 은 객체가 삭제될 때 꼭 실행해야 하는 코드가 없다면, 굳이 클래스 내부에 정의할 필요가 없다.

 

파이썬의 특징은 a 라는 변수에 어떤 값을 저장하고, 다시 a에 다른 새로운 값을 저장하면 새로운 값으로 덮어 씌운다.

이 내부 동작원리를 다시 뜯어보면, 기존 a는 가비지 컬렉터가 인식해 기존 값을 삭제 후 새로운 값으로 저장하는 것이다.

 

이건 클래스의 인스턴스를 생성할 때에도 그대로 적용된다.

때문에, A 라는 이름의 인스턴스를 생성하고, 똑같은 A를 새로운 클래스의 인스턴스로 생성할 경우

기존 A의 클래스는 자동으로 삭제되고, 새로운 인스턴스 A가 생성된다.

 

이 때 __del__ 을 명시적으로 정의하지 않았다면 별다른 액션 없이 새로운 인스턴스가 생성되지만,

명시적으로 정의할 경우에는 먼저 __del__에 정의된 코드를 실행하고 기존 인스턴스 삭제 >> 새로운 인스턴스 생성 절차를 밟는다.

 

아래 코드는 그 예시를 보여준다.

(클래스는 모듈인 py 파일로 만들고 객체 생성 스크립트는 주피터에서 실행한걸 편집한거다.)

class The_Home:
    
    # Constructor
    def __init__(self, name):
        self.Name = name

    def __del__(self):
        print("Destroyed")


home = The_home('IPARK')
print("첫 번째 객체 생성 완료:", home.Name)

home= The_home('PRUGIO')
print("두 번째 객체 생성 완료", home.Name)

 출력 결과

\(\quad\) 첫 번째 객체 생성 완료: IPARK
\(\quad\) Destroyed
\(\quad\) 두 번째 객체 생성 완료 PRUGIO

 

첫 번째 home을 생성할 때에는 기존에 존재하지 않던 인스턴스를 생성하므로 바로 생성된다.

하지만 두 번째 home을 생성할 때에는 기존의 home 인스턴스를 삭제 하고 새로운 인스턴스를 생성하기 때문에,

먼저 기존의 인스턴스를 삭제하게 되고, 이 때 __del__에 정의한 코드를 실행하고 삭제하게 된다.

 

따라서 결론은, 실제 프로그래밍에서 __del__을 사용하려면 그에 맞는 구조를 잘 설계하고 사용해야 할 것이다.

 

 

반응형

'GPT모음집' 카테고리의 다른 글

파이썬 메서드 정의 순서와 실행  (0) 2023.09.20