본문 바로가기
카테고리 없음

[파이썬][에러] 'NoneType' object has no attribute 'print_func'

디지털노마드 2023. 2. 7.
반응형

 

 

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 까지의 실행을 보장한다. -_-

 

반응형

댓글