반응형
1. 기본 개념
@property를 사용하면, 메서드가 속성처럼 작동한다. 즉 값을 읽거나 쓸 때, 추가적인 로직을 실행할 수 있다.
이를 사용하면 메서드 호출을 속성처럼 사용할 수 있으며, 캡슐화를 유지하면서도 더 직관적인 코드를 작성할 수 있다.
1-1. 사용하는 이유
캡슐화 - 클래스 내부의 변수는 숨기고, 외부에서 간접적으로 접근하도록 허용.
데이터 유효성 검증 - 값을 설정하거나 가져올 때, 검증 로직 추가 가능.
인터페이스 유지 - 메서드를 속성처럼 보이게하여 직관적으로 사용가능
코드의 유지 보수성 - 나중에 속성 접근에 로직을 추가하여도 기존의 인터페이스를 깨지 않음.
1-2. 구성 요소
Getter: 속성 값을 가지고 오는 메서드 (@property로 데코레이트)
Setter: 속성 값을 설정하는 메서드 (@속성명.setter로 데코레이트)
Deleter: 속성 값을 삭제하는 메서드 (@속성명.deleter로 데코레이트)
1-3. 장단점
장점
- 속성과 메서드를 동일하게 사용할 수 있어 코드가 간결해짐
- 데이터를 숨기고, 필요한 로직을 추가할 수 있어 캡슐화 강화
- 객체의 인터페이스를 유지하면서 내부 구현을 자유롭게 변경 가능
단점
- 과도한 사용은 코드의 가독성을 떨어트림
- 속성 접근 시 숨겨진 로직이 실행되므로 성능이 중요한 경우 주의 필요
1-4. 예시
기본 사용
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@property
def radius(self, values):
if values < 0:
raise ValueError("Radius cannot be negative")
self._radius = value
@radius.deleter
def radius(self):
del self._radius
c = Circle(5)
print(c.radius) # 5 (속성처럼 사용)
c.radius = 10 # 값 설정
print(c.radius) # 10
# c.radius = -100 # ValueError 발생
계산된 속성
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
return self.width * self.height
@property
def perimeter(self):
return 2 * (self.width + self.height)
rect = Rectangle(4, 5)
print(rect.area) # 20
print(rect.perimeter) # 18
읽기전용 속성
class Product:
def __init__(self, name, price):
self.name = name
self._price = price
@property
def price(self):
return self._price # 읽기만 가능
p = Product("Laptop", 1000)
print(p.price) # 1000
# p.price = 1200 # AttributeError 발생
반응형
'Django > DRF' 카테고리의 다른 글
[Django] Locust를 이용한 부하 테스트 회고 (feat. Redis, Celery, Kafka) (3) | 2025.01.11 |
---|---|
[DRF] 쿼리 성능 향상 (Feat. ORM 최적화 기법) (0) | 2024.10.29 |
[Django] 테스트 : pytest-django, factory-boy, facker (2) | 2024.10.21 |
[Django] 읽기 전용 데이터베이스 설정 및 테스트 (0) | 2024.10.11 |
[Django] 랜덤 객체를 가지고 오는 방법 (1) | 2024.09.13 |