ABOUT ME

-

  • [python] 파이썬 property객체, @property 데코레이터
    코딩 연습/코딩배우기 2020. 9. 14. 14:31

     

    ■ 파이썬의 내장 함수에 property가 있으며, 클래스 변수를 속성으로 선언하고 메소드를 get, set 인자로 받아 property 객체를 생성하고, getter, setter 기능을 수행토록 한다.

    class Natural:
        def __init__(self, n):
            self.set_n(n)  # 아래의 setn 메서드 호출
        
        def get_n(self):  # getter
            return self.__n
        
        def set_n(self, n):  # setter
            if n < 1:
                self.__n = 1
            else:
                self.__n = n
        
    def main():
        n1 = Natural(1)
        n2 = Natural(2)
        n3 = Natural(3)
        n1.set_n(n2.get_n() + n3.get_n())
        print(n1.get_n())  # 5
    
    
    main()
    

     

    # 위 코드를 property를 적용하여 설정하면,

    class Natural:
        def __init__(self, n):
            self.set_n(n)
        
        def get_n(self):  # getter
            return self.__n
        
        def set_n(self, n):  # setter
            if n < 1:
                self.__n = 1
            else:
                self.__n = n
        
        n = property(get_n, set_n)  # 프로퍼티(property) 객체 생성 후 n에 할당
        
        
    def main():
        n1 = Natural(1)
        n2 = Natural(2)
        n3 = Natural(3)
        n1.n = n2.n + n3.n
        print(n1.n)
        
        num = Natural(7)
        print(num.n)  # 7
        num.n = 20
        print(num.n)  # 20
    
    
    main()
    
    

    # n = property(get_n, set_n)의 의미는
    속성(변수) n의 값을 '참조'하는 경우에는 get_n을 호출해서 반환되는 값을 전달하겠다.
    속성(변수) n의 값을 '저장'하는 경우에는 set_n을 호출해서 그 값을 전달하겠다.
    # num.n = 20 의 경우 num.set_n(20)과 같으며
    # num.n은 num.get_n()과 같음

    good4me.co.kr


    # 위 코드에서는 property 객체를 생성하면서 get_n과 set_n 메서드를 등록(지정)하는 방식이다.

    # 위와 동일한 기능을 수행하도록 데코레이터를 사용하여 프로퍼티를 지정할 수 있다.

    class Natural:
        def __init__(self, n):
            self.n = n  # 프로퍼티(property) n을 통해 접근
        
        @property
        def n(self):  # getter 동작
            return self.__n
        
        @n.setter
        def n(self, n):  # setter 동작
            if n < 1:
                self.__n = 1
            else:
                self.__n = n
        
        
    def main():
        n1 = Natural(1)
        n2 = Natural(2)
        n3 = Natural(3)
        n1.n = n2.n + n3.n
        print(n1.n)
        
        num = Natural(7)
        print(num.n)  # 7
        num.n = 20
        print(num.n)  # 20
    
    
    main()
    
    

    # getter 동작 부분의 아래 코드와 같으며, property 객체를 생성하면서 이어서 등장하는 메서드를 게터(getter)로 지정하고, 그 메서드명에 생성된 property 객체 저장한다는 의미이다. (파이썬에서는 메서드 이름도 변수이기 때문에 메서드명에 다른 값을 저장할 수 있다.)

    def n(self):
        return self.__n
    n = property(n)

     

    # setter 동작 부분 또한, property 객체를 이어서 등장하는 메서드를 대상으로 세터(setter)로 지정하고, 그 메서드명에 생성된 property 객체 저장한다는 의미이다.

     

    [참고 자료] 윤성우의 열혈파이썬 중급편

     

     

Designed by goodthings4me.