Just Fighting
파이썬의 getter, setter (@property) 본문
자바를 처음 공부하면서 getter, setter의 개념을 알고는 있었으나,
파이썬에서 getter, setter를 사용하는 방식은 매우 달랐다.
바로 @property를 사용하면 된다.
@property
@property는 외부에서 호출하지 못하는 클래스의 속성(변수)을
메서드처럼 호출할 수 있도록 하며, 이게 바로 getter의 역할을 한다.
setter는 @변수명.setter와 같이 선언해주면 된다.
setter를 안 쓸 경우에는 읽기전용 변수가 된다고 생각하면 된다.
코드를 함께 살펴보자!
class Person:
def __init__(self, name):
self._name = name # 내부적으로 _name을 사용 (직접 접근 방지)
@property
def name(self): # getter 역할
return self._name
@name.setter
def name(self, value): # setter 역할
if not value:
raise ValueError("이름을 비울 수 없습니다!")
self._name = value # 내부적으로 _name을 수정
p = Person("Alice")
print(p.name) # getter 실행 → "Alice"
p.name = "Bob" # setter 실행
print(p.name) # "Bob"
p.name = "" # ValueError 발생 (setter에서 검증)
잘못 쓰면 무한루프
파이썬에도 자바의 private처럼 사용할 수 있는 표기가 있다. 바로 변수 앞에 '_'를 적어주는 것.
밖에서 호출이 가능하긴 하지만, 내부에서만 쓰는 변수라고 선언한 것과 동일하다.
제대로 알지 못하고 변수 앞에 _를 떼고 돌리니
바로 무한 루프에 빠져 커널이 종료되는 현상이 발생했다.
class Person:
def __init__(self, name):
self.name = name # 내부적으로 name을 사용 (직접 접근 방지)
@property
def name(self): # getter 역할
return self.name
@name.setter
def name(self, value): # setter 역할
if not value:
raise ValueError("이름을 비울 수 없습니다!")
self.name = value # 내부적으로 name을 수정
그 이유는 바로 변수명 자체가 함수처럼 호출해서 사용하는 방식이기 때문이다.
self.name을 호출하면 @property가 실행되고, return self.name이 실행되기 때문에 무한 루프에 빠질 수 밖에 없다.
따라서, getter와 setter 안의 변수는 꼭 '_'를 붙여서 사용해야 한다.
응용 예제
딕셔너리의 형태의 변수를 업데이트하는 예시를 한 번 만들어봤다.
save_name이라는 함수에 리스트를 인풋으로 넣어 self.names라는 변수에 저장하는 예제이다.
값을 저장할 때, self.names = (self.idx, name)을 사용해 self.idx가 키로, name이 값으로 저장되도록 했다.
이 때, setter는 무조건 input을 하나만 사용해야 한다고 한다.
매개변수를 더 추가하면 오류가 발생한다. 나도 알고 싶지 않았다.
class Test:
def __init__(self):
self.names = {}
self.idx = 0
@property
def names(self): # Getter
return self._names
@names.setter
def names(self, value): # Setter
if not hasattr(self, "_names"):
self._names = {}
return
if value is None or value[1] is None:
pass
self._names[value[0]] = value[1]
def save_name(self, names):
for name in names:
self.idx += 1
self.names = (self.idx, name)
'Python' 카테고리의 다른 글
파이썬의 and, or 연산 사용법 (0) | 2025.04.18 |
---|---|
DataFrame의 attrs 속성 (0) | 2025.03.02 |
빈 이중배열과 주소값 (0) | 2023.07.05 |
[Python] 중복 순열 구하기 (product) (0) | 2022.11.30 |
datetime 함수 정리 (0) | 2022.10.20 |