파이썬에서 클래스의 함수를 프로퍼티로 작성하였을 때, 기존에 있지 않은 함수(세터)를 호출할 시 에러를 던지게 할 수는 없나요?
조회수 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
-
(•́ ✖ •̀)
알 수 없는 사용자 -
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
-
댓글 입력