KimbgAI

[python] @property 사용하기 본문

python

[python] @property 사용하기

KimbgAI 2023. 2. 6. 14:41
반응형

클래스에서 매서드를 통해 속성의 값을 가져오거나 저장하는 경우가 있습니다.
예를들면, 아래와 같습니다.

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/

 

 

반응형
Comments