사용
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")
결과
'Python > 기본' 카테고리의 다른 글
[Python] pip로 패키지 설치(Mac) (0) | 2024.10.28 |
---|---|
[Python] Mac에 여러 버전의 python이 설치되었을 때 사용할 python을 설정 (0) | 2024.10.27 |
[Python] Mac에 Python 설치 (0) | 2024.10.27 |
[Python] 상수 사용 (0) | 2024.10.07 |
[Python] dictionary (0) | 2024.10.05 |