[python] python's getter & setter , property

songmoana·2023년 10월 24일

클래스의 필드명으로 데이터 접근

class Person:
	def __init__(self,first_name, last_name, age):
    	self.first_name = first_name
        self.last_name = last_name
        self.age = age
        

person = Person('moana', 'song', 28)
>>> person.age 
>>> 28
>>> person.age = 29
>>> person.age
>>> 29
  • 이처럼 class 객체의 필드명으로 내부 데이터에 접근하는 것은 편리하지만,
    해당 데이터는 외부에서 마음대로 변경할 수 있게 된다.
class Person:
	def __init__(self,first_name, last_name, age):
    	self.first_name = first_name
        self.last_name = last_name
        self.set_age(age)
        
    def get_age(self):
    	return self._age
    
    def set_age(self, age):
    	if age < 0:
        	raise ValueError("Invalid age")
       	self._age = age

_age 이름을 가진 변수는 외부에서 직접 접근하지 않는 파이썬의 관행이 있다.
-> 인스턴스 변수명을 self.age 대신 self._age 로 변경

python 에서 _를 쓰는 5가지 경우

1. 인터프리터에서 마지막 값을 저장할 때
2. 값을 무시하고 싶을 때
3. 변수나 함수명에 특별한 의미 또는 기능을 부여하고자 할 때
	* _single_leading_underscore :주로 한 모듈 내부에서만 상요하는 private 클래스/함수/변수/메서드를
    선언할 때 사용하는 컨벤션
    
4. 국제화/지역화 함수로써 사용할 때
5. 숫자 리터럴값의 자릿수 구분을 위한 구분자로써 사용할 때
>>> person = Person('moana','song', 28)
>>> person.get_age()
>>> 28

>>> person.set_age(-1)
ValueError: Invalid age
>>> person.set_age(person.get_age()+1)
>>> person.get_age()
>>> 29

# getter & setter 메서드를 통해서 내부 데이터에 대한 접근을 통제할 수 있음.

property() 함수

  • python 내장 함수 property 를 사용하면 필드명을 사용할 때와 비슷하게 getter & setter 메서드가 호출될 수 있게 함.
class Person:
    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age

    def get_age(self):
        return self._age

    def set_age(self, age):
        if age < 0:
            raise ValueError("Invalid age")
        self._age = age

    age = property(get_age, set_age)
    
    
>>> person = Person('moana','song',28)
>>> person.age
28
>>> person.age = -1
ValueError: Invalid age
>>> person.age = person.age + 1
>>> person.age
29

@property 데코레이터

class Person:
    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age

    @property # 기존의 getter method 윗 부분에 데코레이터를 넣고 함수명을 <필드명> 으로 변경
    def age(self):
        return self._age

    @age.setter    # @<필드명>.setter
    def age(self, age):
        if age < 0:
            raise ValueError("Invalid age")
        self._age = age
        
# 위의 property 함수 대신 더 간단하게 표현할 수 있는 getter & setter method
 
>>> person = Person('moana', 'song', 28)
>>> person.age
>>> 28

>>> person.age = -1
ValueError: Invalid age
>>> person.age = person.age + 1
>>> person.age
>>> 29

# 외부에 티내지 않고 내부적으로 클래스의 필드 접근 방법을 변경할 수 있음!
profile
옹모아나 - 개발백과

0개의 댓글