Property

Private vs public

  • __는 private
  • _는 protected
  • 언어 자체에서 강제하진 않음. 정보 제공 느낌

@property 를 사용하는 목적

  1. 변수를 변경할 때 특정 제한을 두고 싶을 경우
  2. get,set 함수를 만들지 않고 더 간단하게 접근하게 하기 위해서
  3. 하위 호환성에 도움

생각

  • 사람의 기억은 한정적이기 때문에, 그리고 코드 만든 사람이 퇴사했을 경우 유지보수를 위해 생성
  • 직접 method에 접근할 수 있으면 문제가 생길 수 있음

In [2]:
class Test:

    def __init__(self):
        self.public_field = 5
        self.__private_field = 6
        self._protected_field = 7

    def __private_method(self):
        pass

if __name__ == '__main__':

    t = Test()

    t.public_field = 10
    t.__private_field = 11
    t._protected_field = 12

In [3]:
t.public_field


Out[3]:
10

In [4]:
t.__private_field


Out[4]:
11

In [5]:
t._protected_field


Out[5]:
12

In [7]:
class Test:
    def __init__(self):
        self.color = "red"

    def set_color(self,clr):
        self.color = clr
    
    def get_color(self):
        return self.color

In [8]:
t = Test()
t.set_color("blue")

print(t.get_color())


blue

In [9]:
t1 = Test()

In [10]:
print(t1.get_color())


red

In [11]:
t1.color


Out[11]:
'red'

In [12]:
class Test:
    def __init__(self):
        self.__color = "red"

    @property
    def color(self):
        return self.__color

    @color.setter
    def color(self,clr):
        self.__color = clr
# get 역할을 하는 어노테이션은 @property 이고, set역할을 하는 어노테이션은 @color.setter

In [13]:
t = Test()
t.color = "blue"

print(t.color)


blue

In [14]:
class Celsius:
    def __init__(self):
        pass
    def to_fahrenheit(self):
        return (self._temperature * 1.8) + 32

    @property
    def temperature(self):
        print("Getting value")
        return self._temperature

    @temperature.setter
    def temperature(self, value):
        if value < -273:
            raise ValueError("Temperature below -273 is not possible")
        print("Setting value")
        self._temperature = value

In [20]:
c = Celsius()
c._temperature = -300
print(c.temperature)


Getting value
-300

In [34]:
class Test1:
    def __init__(self):
        pass
    
    @property
    def property1(self):
        print("a")
        return self._property
    
    @property1.setter
    def property(self, value):
        if value >= 5:
            print("over 5")
        else:
            print("down 5")
        self._property1 = value

In [38]:
k = Test1()
k._property = 1

In [39]:
k.property


a
Out[39]:
1

In [ ]: