일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- words encoding
- parrec
- nibabel
- 확산강조영상
- 파이썬
- precision #정밀도 #민감도 #sensitivity #특이도 #specifisity #F1 score #dice score #confusion matrix #recall #PR-AUC #ROC-AUC #PR curve #ROC curve #NPV #PPV
- deep learning #segmentation #sementic #pytorch #UNETR #transformer #UNET #3D #3D medical image
- 유전역학
- nfiti
- MRI
- Surgical video analysis
- 모수적 모델
- non-parametric model
- 데코레이터
- Phase recognition
- genetic epidemiology
- 확산텐서영상
- PYTHON
- MICCAI
- TeCNO
- 비모수적 모델
- TabNet
- nlp
- tabular
- paper review
- 코드오류
- decorater
- monai
- parer review
- parametric model
- Today
- Total
KimbgAI
[python] @property 사용하기 본문
클래스에서 매서드를 통해 속성의 값을 가져오거나 저장하는 경우가 있습니다.
예를들면, 아래와 같습니다.
class Person:
def __init__(self, a, b):
self.name = a
self.age = b
person = Person("John", 20)
print(person.age)
person.age = person.age + 1
print(person.age)
20
21
Person 클래스의 인스턴스를 생성 후에, 필드 값을 읽거나 쓰는 것은 매우 자유롭습니다.
하지만 이렇게 되면 해당 데이터는 외부로부터 무방비 상태에 놓이게 됩니다.
이러한 상황에서 데이터를 접근을 관리할 수 있게 @property를 사용할 수 있습니다.
class Person:
def __init__(self, a, b):
self.__name = a # private으로 선언
self.__age = b # private으로 선언
@property
def name(self):
return self.__name # name에 property 객체 저장
@property
def age(self):
return self.__age # age에 property 객체 저장
person = Person('john', 20)
print(person.age)
person.age = person.age + 1
20
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-9-acf78280ab8e> in <module>
16 print(person.age)
17
---> 18 person.age = person.age + 1
AttributeError: can't set attribute
위 결과를 보게되면,
인스턴스의 값을 읽는 건 가능하지만, 수정은 되지 않는 것을 확인할 수 있습니다.
age는 private으로 선언하기 위해서 던더(언더바 두개)를 사용하였고,
age라는 함수를 통해 간접적으로 age라는 필드명으로 접근하고 변경할 수 있습니다.
@property에는 3개의 메서드가 있습니다.
값을 가져오는 메서드인 getter, 값을 저장하는 메서드인 setter, 값을 삭제하는 deleter 등 3개의 메서드가 있습니다.
이를 이용하여 값을 수정할 수 있도록 할 수 있습니다.
class Person:
def __init__(self, a, b):
self.__name = a # private으로 선언
self.__age = b # private으로 선언
@property
def name(self):
return self.__name # name에 property 객체 저장
@property
def age(self):
return self.__age # age에 property 객체 저장
@age.setter
def age(self, value):
self.__age = value
person = Person('john', 20)
print(person.age)
person.age = person.age + 1
print(person.age)
20
21
getter, setter 메서드의 이름을 잘 보면 둘다 age입니다.
그리고 getter에는 @property가 붙어있고, setter에는 @age.setter가 붙어있습니다.
즉, 값을 가져오는 메서드에는 @property 데코레이터를 붙이고, 값을 저장하는 메서드에는 @메서드이름.setter 데코레이터를 붙이는 방식입니다.
특히 @property와 @age.setter를 붙이면 james.age처럼 메서드를 속성처럼 사용할 수 있습니다.
참고자료
https://dojang.io/mod/page/view.php?id=2476
https://www.daleseo.com/python-property/
'python' 카테고리의 다른 글
[python] ParRec 파일을 nifti 파일로 변환 (0) | 2024.01.09 |
---|---|
[python] 데코레이터(decorator, @)란? (0) | 2023.02.06 |
tqdm 활용 with dataloader (0) | 2022.11.07 |
[python] 자주 사용하는 conda 명령어 (0) | 2022.09.28 |
[python] pip install but can't import (0) | 2022.09.16 |