본문 바로가기
Python

파이썬 프라이빗 변수와 getter, setter

by 승환파크 2023. 5. 10.

프라이빗 변수

클래스 내부의 변수를 외부에서 사용하는 것을 막고 싶을 때 사용한다.

 

표현 방법

__변수이름

import math
class Circle:
    def __init__(self, radius):
        self.__radius = radius
        
    def get_ciucumference(self):
        return 2 * math.pi * self.__radius
    
    def get_area(self):
        return math.pi * (self.__radius ** 2)

# 원의 둘레와 넓이 구하기
circle = Circle(10)
print("원의 둘레", circle.get_ciucumference())
print("원의 넓이", circle.get_area())
print("반지름", circle.__radius)

# 결과값
# 원의 둘레 62.83185307179586
# 원의 넓이 314.1592653589793
# AttributeError: 'Circle' object has no attribute '__radius'

 

게터(getter), 세터(setter)

프라이빗 변수 예제에서 사용된 원의 반지름을 변경하고 싶다면 __radius 를 변경해야 하지만 프라이빗 변수로 이루어져 있어 접근할 수 없기 때문에 간접적인 방법을 사용해 값을 변경해야 한다.

이 때 게터와 세터를 사용하는데 게터와 세터는 프라이빗 변수의 값을 추출하거나 변경할수 있게 간접적으로 속성에 접근할 수 있게 도와주는 함수이다.

import math
class Circle:
    def __init__(self, radius):
        self.__radius = radius
        
    def get_ciucumference(self):
        return 2 * math.pi * self.__radius
    
    def get_area(self):
        return math.pi * (self.__radius ** 2)
    
    # getter
    def get_radius(self):
        return self.__radius
    
    # setter
    def set_radius(self, value):
        self.__radius = value

circle = Circle(10)
print("원의 둘레", circle.get_ciucumference())
print("원의 넓이", circle.get_area())
print("반지름", circle.get_radius())

# 결과값
# 원의 둘레 62.83185307179586
# 원의 넓이 314.1592653589793
# 반지름 10

circle.set_radius(2)
print("원의 둘레", circle.get_ciucumference())
print("원의 넓이", circle.get_area())
print("반지름", circle.get_radius())

# 결과값
# 원의 둘레 12.566370614359172
# 원의 넓이 12.566370614359172
# 반지름 2

이처럼 함수를 사용해서 프라이빗 변수에 접근해 값을 바꿀 수 있는데 함수를 사용하여 값을 변경하게 하면 여러가지 추가 처리또한 할 수 있다.

ex) 반지름의 값을 양수로만 한정하기

 

위의 코드에서 setter 메서드 변경하기

# setter
    def set_radius(self, value):
        if value <= 0:
            raise TypeError("반지름은 양의 숫자여야 합니다")
        self.__radius = value

circle = Circle(10)
circle.set_radius(0)

# 결과값
# TypeError: 반지름은 양의 숫자여야 합니다

 

 

데코레이터를 사용한 게터와 세터

파이썬에서 게터와 세터를 함수로 만드는 일이 많아져서 게터와 세터를 쉽게 만들 수 있는 기능을 제공한다.

표현 방법

@property

@게터함수이름.setter

import math
class Circle:
    def __init__(self, radius):
        self.__radius = radius
        
    def get_ciucumference(self):
        return 2 * math.pi * self.__radius
    
    def get_area(self):
        return math.pi * (self.__radius ** 2)
    
    # getter
    @property
    def radius(self):
        return self.__radius
    
    # setter
    @radius.setter
    def radius(self, value):
        if value <= 0:
            raise TypeError("반지름은 양의 숫자여야 합니다")
        self.__radius = value

circle = Circle(10)
print("원래 원의 반지름", circle.radius)
circle.radius = 2
print("변경된 원의 반지름", circle.radius)

# 결과값
# 원래 원의 반지름 10
# 변경된 원의 반지름 2

circle.radius = -10

# 결과값
# TypeError: 반지름은 양의 숫자여야 합니다.
# 변수에 값을 할당하는것이 아닌 setter로 사용되는것을 확인할 수 있다.

이처럼 데코레이터를 사용하면 객체.변수를 사용하는 것만으로도 자동으로 게터와 세터가 호출되게 된다.

'Python' 카테고리의 다른 글

파이썬 웹 크롤링  (1) 2023.05.10
파이썬 상속  (0) 2023.05.10
파이썬 가비지 컬렉터  (1) 2023.05.10
파이썬 클래스 변수와 클래스 메서드  (0) 2023.05.10
파이썬 특수한 이름의 메서드  (1) 2023.05.10