June 24,2020
, 2 min read

python 에서 Class를 생성하고, 변수를 할당하기위해 getter,setter,deleter 를 사용할 수 도 있다.
하지만, pythonic 스럽지 않다. 왜냐하면 python 에서는 Class.x 와 같은 방식으로 데이터에 접근하고, 조작하기 때문이다.
class C:
    def __init__(self):
        self._x = None
    def getx(self):
        return self._x
    def setx(self, value):
        self._x = value
    def delx(self):
        del self._x
    x = property(getx, setx, delx, "I'm the 'x' property.")python 에서는 property 라는 클래스를 만들어 데코레이터 형식으로 제공한다.
사용방법은 method 이름을 getter, setter, deleter 모두 동일하게 한다.
getter -> @property
setter -> @methodname.setter
deleter -> @methodname.deleter
와 같이 설정하여 사용하면 된다.
class C:
   def __init__(self):
       self._x = None
   @property
   def x(self):
       """I'm the 'x' property."""
       return self._x
   @x.setter
   def x(self, value):
       self._x = value
   @x.deleter
   def x(self):
       del self._x오직 양의 숫자만 가능한 setter를 만들어보자.
class C:
    def __init__(self):
        self._x = None
    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x
    @x.setter
    def x(self, value):
        try :
            if type(value) == int or type(value) == float:
                pass
            else:
                raise NumberError("숫자만 담을 수 있습니다.")
            if value < 0 :
                raise NumberError("음수는 담을 수 없습니다.")
        except NumberError as e:
            print(e)
        else :
            self._x = value
    @x.deleter
    def x(self):
        del self._x
class NumberError(Exception):
    def __init__(self,msg):
        self.msg = msg
    
    def __str__(self):
        return self.msg
c = C()
c.x = "3a"
print(c.x)
# 숫자만 담을 수 있습니다.
# None
c.x = "3"
print(c.x)
# 숫자만 담을 수 있습니다.
# None
c.x = -3
print(c.x)
# 음수는 담을 수 없습니다.
# None
c.x = 3  
print(c.x)
# 3