blog

파이썬의 Property 사용법

날짜: 2024-11-30

목록으로


파이썬에서 property는 일반적으로 property() 함수 또는 @property 데코레이터를 가리킵니다. 둘은 같은 기능을 제공하며, 클래스에서 getter, setter, deleter를 정의하여 속성 접근 방식을 제어하는 데 사용됩니다.

즉, property라는 용어는 데코레이터 그 자체만을 뜻하는 것이 아니라, 파이썬에서 속성을 정의하고 관리하는 데 사용하는 메커니즘을 의미합니다.


1. property() 함수

예제: property() 함수

class MyClass:
    def __init__(self, value):
        self._value = value

    def get_value(self):  # getter
        return self._value

    def set_value(self, new_value):  # setter
        if new_value < 0:
            raise ValueError("Value must be non-negative")
        self._value = new_value

    def del_value(self):  # deleter
        del self._value

    value = property(get_value, set_value, del_value, "This is a managed property")

obj = MyClass(10)
print(obj.value)  # getter 호출: 10
obj.value = 20    # setter 호출
print(obj.value)  # 출력: 20
del obj.value     # deleter 호출

2. @property 데코레이터

예제: @property 데코레이터

class MyClass:
    def __init__(self, value):
        self._value = value

    @property
    def value(self):  # getter
        return self._value

    @value.setter
    def value(self, new_value):  # setter
        if new_value < 0:
            raise ValueError("Value must be non-negative")
        self._value = new_value

    @value.deleter
    def value(self):  # deleter
        del self._value

obj = MyClass(10)
print(obj.value)  # getter 호출: 10
obj.value = 20    # setter 호출
print(obj.value)  # 출력: 20
del obj.value     # deleter 호출

3. property()@property의 차이점

| property() | @property 데코레이터 | |————————————–|———————————————–| | 함수 호출을 통해 getter, setter, deleter를 설정 | 데코레이터로 간결한 문법 제공 | | 명시적으로 property(fget, fset, fdel) 사용 | @property, @<name>.setter, @<name>.deleter 사용 | | 문서 문자열을 인수로 전달 가능 | __doc__에 문자열을 추가하면 동일한 효과 |


4. property를 사용하는 이유

예제: 속성 값 검증

class Temperature:
    def __init__(self, celsius):
        self._celsius = celsius

    @property
    def celsius(self):  # getter
        return self._celsius

    @celsius.setter
    def celsius(self, value):  # setter
        if value < -273.15:
            raise ValueError("Temperature below -273.15°C is not possible")
        self._celsius = value

temp = Temperature(25)
print(temp.celsius)  # 출력: 25
temp.celsius = -300  # ValueError: Temperature below -273.15°C is not possible

5. 잘못된 이해 방지


6. 요약


목록으로