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


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

 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가 나는 것을 확인하였습니다. 이를 먼저 확인한 후 세터를 진행해야 하는것인지 궁금합니다.)

  • 2016년 05월 15일에 작성됨
    저는 파이썬을 주로 사용하고 있습니다.

조회수 255


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
  • 2016년 05월 15일에 수정됨
    CEO & Researcher @ Theori. Security / Hacking.
  • 2016년 05월 15일에 작성됨
    CEO & Researcher @ Theori. Security / Hacking.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close