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을 이용해서 유저의 이메일 정도를 가져오거나 수정할 수 있도록 합니다.

728x90