본문 바로가기
Python Object-oriented Programming

readonly-property

by 자동매매 2023. 4. 4.

출처 : https://www.pythontutorial.net/python-oop/python-readonly-property/

 

Python Readonly Property

in this tutorial, you'll learn how to define Python readonly property and how to use it for computed property and caching.

www.pythontutorial.net

 

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 다시 사용할 있습니다.

이를 위해 캐싱 기술을 사용할 있습니다.

  1. 면적을 계산하여 캐시에 저장합니다.
  2. 반경이 변경되면 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

 

작동 방식.

  1. __init__ 메서드에서 _area을  None으로 설정합니다. _area 속성은 computed area을 저장하는 캐시입니다.
  2. radius가 변경되면(setter에서) _areaNone으로 재설정합니다.
  3. 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

댓글