Just Fighting

파이썬의 getter, setter (@property) 본문

Python

파이썬의 getter, setter (@property)

yennle 2025. 3. 4. 21:38
728x90

 

 

자바를 처음 공부하면서 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)

 

 

 

728x90

'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
Comments