반응형
with 구문을 공부하다가 많이 본 에러인데,
AttributeError: 'NoneType' object has no attribute 'print_func'
해석하면 뭔가의(?) 오브젝트가 없다는 말이다.
실제로 내가 구현하지 않은 함수를 불러내면 나오는 에러일때도 있지만,
with 구문에서 __enter__ 나 __exit__ 에 return self 를 안넣으면 나오는 에러이다.
실제 with 에서는 return self 를 통해서 계속해서 자신을 불러서 사용해야 하는데,
이걸 지워버리면 불러낸 객체가 없기 때문에 에러가 발생한다.
class with_test:
def __init__(self, param):
self.num = param
print("init")
def get_num(self) -> int:
return self.num
def print_func(self):
print("{} print".format(self.num))
def __enter__(self):
print("enter")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("exit")
return self
with with_test(5) as engine2:
engine2.print_func()
print(engine2.get_num())
위의 코드는 실행이 아래와 같이 된다.
반면 이 코드에서 __enter__ 와 __exit__ 의 return self 를 빼버리면
class with_test:
def __init__(self, param):
self.num = param
print("init")
def get_num(self) -> int:
return self.num
def print_func(self):
print("{} print".format(self.num))
def __enter__(self):
print("enter")
# return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("exit")
# return self
with with_test(5) as engine2:
engine2.print_func()
print(engine2.get_num())
아래와 같은 에러 메세지가 나온다.
에러가 나도 끝까지 exit 출력하고 죽는거 봐라...
with 구문을 쓰면 exit 까지의 실행을 보장한다. -_-
반응형
댓글