Python의 속성 데코레이터

Manav Narula 2023년6월21일
  1. 파이썬의 속성
  2. Python에서 @property 데코레이터 사용
Python의 속성 데코레이터

Python에서 클래스를 만들고 다양한 데이터 멤버와 함수를 정의할 수 있습니다. 모든 것이 객체이고 우리가 정의한 클래스의 객체를 인스턴스화할 수 있습니다.

이 튜토리얼은 Python 속성 데코레이터(@property)를 사용하는 방법을 보여줍니다.

파이썬의 속성

때로는 Python의 getter 및 setter 함수를 사용하여 비공개 클래스 속성을 반환합니다.

클래스 내에 이 속성을 반환하는 함수인 getter 함수를 만듭니다.

이러한 속성에 대한 값을 설정할 수 있는 함수를 setter 함수라고 합니다.

예시:

class A:
    def __init__(self, a):
        self._a = a

    def getter_a(self):
        return self._a

    def setter_a(self, val):
        self._a = val


n = A(5)
print(n.getter_a())
n.setter_a(10)
print(n.getter_a())

출력:

5
10

위의 예에서 a의 속성 값을 반환하고 변경하는 getter 및 setter 함수를 만들었습니다.

이 방법은 속성을 다루는 파이썬 방식으로 간주되지 않습니다. getter 및 setter 메서드를 사용하여 클래스를 클러스터링할 필요를 제거할 수 있습니다.

Python 접근 방식에는 주어진 클래스 속성에 대한 기능을 설정할 수 있는 속성을 사용하는 것이 포함됩니다.

property() 함수를 사용하여 property 클래스의 객체를 생성합니다. getter, setter 및 deleter 메서드를 데이터 멤버의 속성으로 연결합니다.

이를 위해 속성 함수 내에서 fget, fset, fdeldoc 인수를 사용합니다.

fget과 관련된 함수는 속성 값을 반환합니다. 유사하게 fset 메소드는 속성 값을 변경하고 fdel 함수는 값을 삭제합니다.

doc 메소드는 주어진 속성에 대한 문서를 제공합니다.

아래 코드에서 이것을 사용할 것입니다.

class A:
    def __init__(self, a):
        self._a = a

    def get_a(self):
        return self._a

    def set_a(self, val):
        self._a = val

    def del_a(self):
        del self._a
        print("Deleted")

    a = property(fget=get_a, fset=set_a, fdel=del_a, doc="Documenttion for a")


n = A(5)
print(n.a)
n.a = 10
print(n.a)
del n.a
print(n.a)

출력:

5
10
Deleted
Traceback (most recent call last):
  File "<string>", line 21, in <module>
File "<string>", line 6, in get_a
AttributeError: 'A' object has no attribute '_a'

위의 예에서 클래스에 대한 속성 ``을 만들고 필요한 속성을 추가했습니다. 보시다시피 deleted 속성을 사용한 후 속성이 제거되었음을 나타내는 AttributeError가 표시됩니다.

Python에서 @property 데코레이터 사용

데코레이터는 Python에서 함수에 추가 기능을 추가하는 데 사용됩니다. 함수는 인수로 사용되며 다른 함수가 반환됩니다.

파이썬에 데코레이터를 도입한 후 속성을 설정하기 위한 property() 함수의 사용이 중단되었고 동일한 데코레이터 구문이 선호되었습니다.

데코레이터는 Python v2.4에서 도입되었습니다. @property 데코레이터는 속성을 만드는 데 널리 사용되었습니다.

아래의 이전 예에서 @property 데코레이터를 사용합니다.

class A:
    def __init__(self, a):
        self._a = a

    @property
    def a(self):
        return self._a

    @a.setter
    def a(self, val):
        self._a = val

    @a.deleter
    def a(self):
        del self._a
        print("Deleted")


n = A(5)
print(n.a)
n.a = 10
print(n.a)
del n.a
print(n.a)

출력:

5
10
Deleted
Traceback (most recent call last):
  File "<string>", line 23, in <module>
File "<string>", line 7, in a
AttributeError: 'A' object has no attribute '_a'

관찰할 수 있듯이 이전 예에서와 동일한 출력을 얻었습니다. 이 방법은 property() 함수보다 비교적 사용하기 쉽습니다.

@property 데코레이터를 사용하여 속성을 속성 이름으로 반환하는 함수를 사용합니다. 그 후 @<property-name>.setter@<property-name>.deleter는 setter 및 deleter 메서드를 추가합니다.

작가: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

관련 문장 - Python Property