클래스의 필드명으로 데이터 접근
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 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 메서드를 통해서 내부 데이터에 대한 접근을 통제할 수 있음.
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
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
# 외부에 티내지 않고 내부적으로 클래스의 필드 접근 방법을 변경할 수 있음!