파이썬에서 클래스의 함수를 프로퍼티로 작성하였을 때, 기존에 있지 않은 함수(세터)를 호출할 시 에러를 던지게 할 수는 없나요?

조회수 1772회

파이썬에서 다음과 같이 코드를 작성하였습니다.

 class Test:
    def __init__(self):
        self.hello = 0

    @property
    def test(self):
        return self.hello

    @test.setter
    det test(self, hello):
        self.hello = hello

if __name__ == '__main__':
    t = Test()
    t.test = 1
    t.test2 = 2 # 여기서 에러가 나게 하고 싶습니다.

제가 메서드 명에서 자꾸 오타를 내는데, test2 에서 에러가 나지 않아 자꾸 실수를 하게 됩니다. 저는 애초에 존재하지 않는 함수를 셋 할 때 에러가 나오게 하고 싶은데요. 어떻게 에러를 던지게 할 수 있는 방법이 있나요?

(값을 대입하지 않고 바로 게터를 부르면 AttributeError가 나는 것을 확인하였습니다. 이를 먼저 확인한 후 세터를 진행해야 하는것인지 궁금합니다.)

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 안녕하세요.

    오타를 내지 않는 방법이 가장 최선이겠지만, __slots__을 이용해서 사용할 프로퍼티에 대해서 미리 선언을 하는 방식을 사용하실 수 있습니다.

    class Test(object):
    
      __slots__ = ['hello']
    
      def __init__(self):
        self.hello = 0
    
      @property
      def test(self):
        return self.hello
    
      @test.setter
      def test(self, hello):
        self.hello = hello
    
    if __name__ == '__main__':
        t = Test()
        t.test = 1
        t.test2 = 2
    
    

    하지만 위에 보시는바와 같이 __slot__은 파이썬 2.2부터 사용가능한 class A(object)와 같은 형식의 'new style' 클래스를 사용하셔야합니다.

    'old style' 클래스를 사용하셔야만 한다면, 다음과 같이 __setattr__를 오버라이드해서 사용하실 수 있긴 합니다.

    class Test:
    
      def __setattr__(self, name, value):
        allowed = ('hello', 'test')
        if name in allowed:
          self.__dict__[name]  = value
        else:
          raise AttributeError('No attribute: %s' % name)
    
      def __init__(self):
        self.hello = 0
    
      @property
      def test(self):
        return self.hello
    
      @test.setter
      def test(self, hello):
        self.hello = hello
    
    if __name__ == '__main__':
        t = Test()
        t.test = 1
        t.test2 = 2
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)