본문 바로가기
Python/기본

[Python] with

by 카피마스터 2024. 11. 1.

사용

with [객체생성] as [객체]:

    ....

 

중요

[객체]는 [객체생성]시 생성되는 객체가 설정되는것이 아니고

__enter__()함수 호출시에 리턴되는 객체가 설정되기 때문에 return 설정이 꼭 필요함

 

설명

with는 사용시 지정한 객체의 __enter__(self)를 호출하고 범위에서 나갈때 __exit__(self,type,value,traceback)를 자동으로 호출해준다

 

리소스(DB나 파일 등)를 사용할때 해제 코드를 빼먹거나 해제 코드를 지정해두었더라도 예외가 발생하여 해제전에 빠져나가는 경우 누수가 발생하는데 클래스 __exit__()에 리소스 해제 코드를 설정해두고 with를 사용하는 경우 범위에서 빠져나갈때 자동으로 해제되기 때문에 누수를 걱정할 필요가 없다

 

예) 사용자 클래스

# 대충 리소스 객체
class ResourceObj:
    # 객체가 초기화 될때 호출
    def __init__(self):
        print("Init")
        
    # 객체가 삭제 될때 호출
    def __del__(self):
        print("Del")
    
    # 리소스 사용    
    def Use(self):
        print("Use Resource")
        
    # with를 사용하는 경우 처음에 호출
    def __enter__(self):
        print("Enter")
        # 리소스 초기화
        # 사용되는 객체를 리턴해주어야한다. 리턴값이 없는경우 as 이후 변수가 None으로 설정됨.
        return self
        
    # with를 사용하는 경우 범위에서 나갈때 호출
    def __exit__(self,type,value,traceback):
        # 여기서 리소스에 대한 해제처리
        print("Exit")
        
        

print("Begin")

# with를 통해서 리소스 객체를 생성하고 사용
with ResourceObj() as res:
    res.Use()
    # 범위를 나갈때 __exit__()가 자동으로 호출

print("End")

 

결과