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
, fdel
및 doc
인수를 사용합니다.
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 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