프라이빗 변수
클래스 내부의 변수를 외부에서 사용하는 것을 막고 싶을 때 사용한다.
표현 방법
__변수이름
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 |