출처 : https://www.pythontutorial.net/python-oop/python-readonly-property/
Introduction to the Python readonly property
readonly property을 정의하려면 getter만 있는 속성을 만들어야 합니다.
그러나 항상 private attribute(_age)에 액세스하여 변경할 수 있으므로 진정한 읽기 전용이 아닙니다.
readonly property은 computed property(계산된 속성)과 같은 일부 경우에 유용합니다.
다음 예제에서는 radius 속성과 area() 메서드가 있는 Circle이라는 클래스를 정의합니다.
import math
class Circle:
def __init__(self, radius):
self.radius = radius
def area(self):
return math.pi * self.radius ** 2
다음은 새 Circle 객체를 만들고 그것의 면적을 반환합니다.
c = Circle(10)
print(c.area())
Output:
314.1592653589793
그러나 area이 메서드가 아니라 Circle 객체의 property이라는 것이 더 자연스럽습니다. area() 메서드를 Circle 클래스의 property으로 만들려면 다음과 같이 @property 데코레이터를 사용할 수 있습니다.
import math
class Circle:
def __init__(self, radius):
self.radius = radius
@property
def area(self):
return math.pi * self.radius ** 2
c = Circle(10)
print(c.area)
면적은 radius 속성에 의해 계산됩니다 . 따라서 calculated or computed property이라고 합니다.
Cache calculated properties
새 circle 개체를 만들고 area 속성에 여러 번 액세스한다고 가정합니다. 매번 면적을 다시 계산해야하므로 효율적이지 않습니다 .
성능을 높이려면 반경이 변경 될 때만 원의 면적을 다시 계산해야합니다. 반경이 변경되지 않으면 이전에 계산된 area을 다시 사용할 수 있습니다.
이를 위해 캐싱 기술을 사용할 수 있습니다.
- 면적을 계산하여 캐시에 저장합니다.
- 반경이 변경되면 area을 재설정하십시오. 그렇지 않으면 다시 계산하지 않고 캐시에서 직접 area을 반환합니다.
다음은 캐시된 area property가 있는 새 Circle 클래스를 정의합니다.
import math
class Circle:
def __init__(self, radius):
self._radius = radius
self._area = None
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value < 0:
raise ValueError('Radius must be positive')
if value != self._radius:
self._radius = value
self._area = None
@property
def area(self):
if self._area is None:
self._area = math.pi * self.radius ** 2
return self._area
작동 방식.
- __init__ 메서드에서 _area을 None으로 설정합니다. _area 속성은 computed area을 저장하는 캐시입니다.
- radius가 변경되면(setter에서) _area는 None으로 재설정합니다.
- area의 computed property을 정의합니다. _area 속성은 None이 아닌 경우 _area반환합니다. 그렇지 않으면 _area을 얻기 위해 계산하고 _area에 저장한 다음 _area를 반환합니다.
Summary
- getter 만 정의하여 property readonly으로 만듭니다.
- computed property을 사용하여 클래스의 property을보다 자연스럽게 만듭니다.
- computed properties을 캐싱하여 성능을 향상시킵니다.
'Python Object-oriented Programming' 카테고리의 다른 글
inheritance (0) | 2023.04.04 |
---|---|
delete-property (0) | 2023.04.04 |
properties (0) | 2023.04.04 |
__del__ Method (0) | 2023.04.04 |
Dependency Inversion Principle (0) | 2023.04.04 |
댓글