6.8 get, set 속성값과 프로퍼티

  • private 속성값을 읽고 쓰기 위해 getter/setter 메서드를 사용한다.
  • 파이썬에서는 getter/setter 메서드가 필요 없다. 모든 속성과 메서드는 public이다.
  • getter/setter를 써야 한다면 프로퍼티를 사용하자.
    class Duck():
    def __init__(self, input_name):
    self.hidden_name = input_name
    def get_name(self):
    print('inside the getter')
    return self.hidden_name
    def set_name(self, input_name):
    print('inside the setter')
    self.hidden_name = input_name
    name = property(get_name, set_name)
    

    두 메서드를 name 이라는 속성의 프로퍼티로 정의함.

    fow1 = Duck('Howard')
    fow1.name
    

    inside the getter ‘Howard’

    fow1.get_name()
    

    inside the getter ‘Howard’

    fow1.name = 'Daffy'
    

    inside the setter

    fow1.name
    

    inside the getter ‘Daffy’

    fow1.set_name('Daffy')
    

    inside the setter

    fow1.name
    

    inside the getter ‘Daffy’

  • 프로퍼티를 정의 하는 또 다른 방법은 데커레이터를 사용 하는 것.
  • getter 메서드 앞에 @property 데커레이터를 쓴다.
  • setter 메서드 앞에 @name.setter 데커레이터를 쓴다.
    class Duck():
    def __init__(self, input_name):
    self.hidden_name = input_name
    @property
    def name(self):
    print('inside the getter')
    return self.hidden_name
    @name.setter
    def name(self, input_name):
    print('inside the setter')
    self.hidden_name = input_name
    
    fow1 = Duck('Howard')
    fow1.name
    

    inside the getter ‘Howard’

    fow1.name = 'Donald'
    

    inside the setter

    fow1.name
    

    inside the getter ‘Donald’

  • 프로퍼티는 계산된 값을 참조 할 수 있다.
    class Circle():
    def __init__(self, radius):
    self.radius = radius
    @property
    def diameter(self):
    return 2 * self.radius
    
    c = Circle(5)
    c.radius
    

    5

    c.diameter
    

    10

    c.radius = 7
    c.diameter
    

    14

    c.diameter = 20
    

    AttributeError Traceback (most recent call last)

in () ----> 1 c.diameter = 20 AttributeError: can't set attribute

Comments