728x90
파이썬에서 객체에 값을 저장하거나 가져올 때, getter와 setter를 사용하는데 이것들을 하나하나 선언하는 것 (get_name 또는 set_name)보다 파이썬에서 지원하는 것이 있다. 그것은 바로 Property(프로퍼티)이다.
Property
Property는 클래스의 어떤 속성에 대한 접근을 제어하는 경우 사용한다. Property는 클래스 속성에 대해 접근을 하는 내장 함수이다. 이를 통해 클래스 속성의 값을 설정하거나 값을 가져올 때 추가적인 기능을 실행할 수 있도록 합니다. 이를 통해서 더욱 파이썬스러운 코드를 작성할 수 있습니다.
getter, setter, deleter 사용방법
기본적으로 Class 다음과 같이 선언되어있다고 해봅시다.
class Person:
def __init__(self, name):
self._name = name # 언더스코어는 보호된 변수를 의미
getter
getter의 경우는 @property 메서드만 사용해주시면 됩니다.
@property
def name(self):
return self._name
다음과 같이 작성을 하면됩니다. 그리고 이 함수는 클래스 내부나 외부에 작성하셔도 됩니다. 다시말해서 위치는 상관이 없습니다.
setter
setter의 경우는 @<property_name>.setter 라고 작성합니다. 또한, 내부에 값이 잘 들어갔는지에 대한 로직을 만들어서 오류를 미리 방지합니다.
@name.setter
def name(self, value):
if not value:
raise ValueError("Name cannot be empty")
self._name = value
deleter
deleter의 경우는 @<property_name>.deleter 메서드를 사용합니다.
@name.deleter
def name(self):
print("Deleting name")
del self._name
코드와 예시는 다음과 같습니다.
class Person:
def __init__(self, name):
self._name = name # 언더스코어는 보호된 변수를 의미
@property
def name(self):
return self._name
@name.setter
def name(self, value):
if not value:
raise ValueError("Name cannot be empty")
self._name = value
@name.deleter
def name(self):
print("Deleting name")
del self._name
# 사용 예
p = Person("John")
print(p.name) # John
p.name = "Alice" # 이름 변경
print(p.name) # Alice
del p.name # 이름 삭제
예시
이메일 작성 예시입니다.
import re
EMAIL_FORMAT = re.compile(r"[^@]+@[^@]+[^@]+")
def is_valid_email(potentially_valid_email: str):
return re.match(EMAIL_FORMAT, potentially_valid_email) is not None
class User:
def _init__(self, username):
self.username = username
self._email = None
# getter
@property
def email(self):
return self._email
# setter
@email.setter
def email(self, new_email):
# 추가 로직 작성
if not is_valid_email(new_email):
raise ValueError(f"유효한 이메일이 아니므로 {new_email} 값을 사용할 수 없음")
self._email = new_email
# deleter
del self._email
# 출력
>>> u1 = User("jsmith ")
>>> u1.email = "jsmith@"
Traceback
...
유효한 이메일이 아니므로 jmith@ 값을 사용할 수 없음
>>> u1.email = "jsmith@g.co"
>>> u1.email
'jsmith@g.co'
getter와 setter을 이용해서 유저의 이메일 정도를 가져오거나 수정할 수 있도록 합니다.
'Coding > Python' 카테고리의 다른 글
[Python] Python에서 빠른 입출력 방법 (0) | 2024.10.06 |
---|---|
[Python] UnicodeEncodeError: 'utf-8' codec can't encode characters in position : surrogates not allowed 해결방법 (0) | 2024.07.08 |
[Python] 타입 힌트를 위한 typing 모듈에 대해 알아보자 (0) | 2024.06.12 |
[Python] 'Fatal error in launcher: Unable to create process using' 오류 해결 방법 (0) | 2024.06.04 |
[Python] Progress Bar(tqdm)을 깔끔하게 출력하는 방법은 무엇일까? (0) | 2024.05.30 |