도찐개찐

[Python] getter, setter 본문

PYTHON

[Python] getter, setter

도개진 2022. 12. 26. 11:53
class Student:

  def __init__(self, name, age):
    self._name = name
    self._age = age

stu1 = Student('son', 20)

위와 같이 학생 클래스가 있을때 학생의 나이에 조건이 있어야 된다면 다음과 같은 코드가 필요할 것이다.

class Student:

  def __init__(self, name, age):
    self._name = name
    if age <= 10:
      raise ValueError('11살 이상의 학생만 가능합니다')
    self._age = age

stu1 = Student('son', 20)
stu1 = Student('son', 8) # ValueError 발생

# __init__함수의 영향을 받지 않으므로 ValueError가 발생하지 않는다
stu1._age = 8

문제 될것 없어보이는 코드지만 객체를 생성하고 나서 값을 변경하게 된다면 더 이상 __init__ 함수의 영향을 받지 않기 때문에 문제가 될 수 있다.

getter 메소드와 setter 메소드를 구현해서 문제를 해결해보자.

getter와 setter

class Student:

  def __init__(self, name, age):
    self.__name = name
    if age <= 10:
      raise ValueError('11살 이상의 학생만 가능합니다')
    self.__age = age

  @property
  def age(self):
    return self.__age

  @age.setter
  def age(self, age):
    if age <= 10:
      raise ValueError('11살 이상의 학생만 가능합니다')
    self.__age = age

값을 읽기 위해 getter 메소드를, 값을 쓰기 위해 setter를 사용하면 된다.

getter를 만들기 위해 @property 데코레이터를 사용한다. 함수 이름은 변수명과 동일하게 작성하는 관례가 있다. 그리고 setter를 만들기 위해 @변수.setter를 사용한다. 마찬가지로 변수명과 동일한 함수명을 추천한다.

이렇게 클래스 내부의 변수에 __(더블 언더스코어)를 덧붙여서 private 속성을 만들고 값이 필요할때 setter 메소드와 getter 메소드를 사용하는 것이 보편적인 객체지향 프로그래밍 방법 중 하나라고 한다.

@property 데코레이터를 통해 프로퍼티를 만들어 보았는데, 사실 수동으로 만드는 방법도 있다.

수동으로 프로퍼티 만들기

class Student:

  def __init__(self, name, age):
    self.__name = name
    self.__age = age

  def get_age(self):
    return self.__age

  def set_age(self, v):
    self.__age = v

  age = property(get_age, set_age)

age에 대한 getter와 setter 메소드를 만들고 마지막에 age라는 이름으로 프로퍼티에 등록해주었다. 이런 방식의 특징은 get_age 메소드와 set_age 메소드를 직접 사용할 수 있다는 것이다.

a = Student('son', 21)
a.get_age() # 21

a.set_age(12)
a.get_age() # 12
a.age # 12

get_age와 set_age가 네임 스페이스에 존재하는지 확인해보자

dir(a)

# 'age',
# 'get_age',
# 'set_age'

만약 데코레이터를 통해 프로퍼티를 작성했다면 get_age와 set_age 함수가 없을 것이다.

728x90

'PYTHON' 카테고리의 다른 글

[PYTHON] setuptools  (0) 2024.03.11
[허깅페이스] pipeline 사용법  (0) 2024.01.23
[Python] 예외처리(try, Except, else, fanally)  (0) 2022.12.26
[Python] 클래스  (0) 2022.12.26
[Python] 함수  (0) 2022.12.26
Comments