ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • python property 사용하기
    프로그래밍/Python 2022. 3. 12. 16:35
    반응형

    안녕하세요 까치입니다.

    이번에는 python 내장함수

    property 데코레이터에 대해 알아보겠습니다.

     

    property 

    예시로 클래스를 이용할때는 __init__함수를 사용하여 생성자를 만들어줍니다. 이부분은 다 아실거라 생각고 넘어 가겠습니다. 안에 필드명을 name, age, grade로 설정 하였습니다.

    class Student:
        def __init__(self, name, age, grade):
            self.name = name
            self.age = age
            self.grade = grade

    self의 name, age , grade를 담아 객체를 만들었을 때 내용이 담기도록 설정 하였습니다. 여기서 그럼 생성한 객체에서 값을 재설정하고, 다시 출력하는 기능을 구현을 해야 하는데 이 부분은 다른 언어에서 사용하는 getter, setter로 정의하여 사용이 가능합니다.

    def get_name(self):
        return self.__name
    
    def set_name(self, setName):
        self.__name = setName

    이렇게 getter, setter를 구형하여 객체의 내용을 출력 및 재정의 할 수 있습니다.

    name = 'hong'
    age = 20
    grade = 'A'
    
    student = Student(name, age, grade)
    print(student.get_name())
    # 출력 hong
    
    student.set_name('jang')
    print(student.get_name())
    # 출력 jang

    자 이렇게 일반적으로 객체를 만들고 getter,setter를 사용하여 변화 및 출력을 하는 경우를 알아 봤는데 python에서는 property라는 내장함수가 정의가 되어있어 더 간단하게 getter,setter를 구현 할 수 있습니다.

    class Student:
        def __init__(self, name, age, grade):
            self.name = name
            self.age = age
            self.grade = grade
    
        def get_name(self):
            return self.__name
    
        def set_name(self, setName):
            self.__name = setName
    	
        # 중요한 부분!!!!!!!
        name = property(get_name, set_name)
    
    name = 'hong'
    age = 20
    grade = 'A'
    
    student = Student(name, age, grade)
    
    #!!!!!!!!!!!!!!!!!!!!!
    # student.get_name() -> student.name 으로 getter, setter 사용가능
    #!!!!!!!!!!!!!!!!!!!!!
    
    print(student.name)
    #출력 hong
    student.name = 'jang'
    print(student.name)
    #출력 jang

    property 내장함수에 위에 정의한 get_name, set_name을 넣어서 설정을 해주면 기존에 작성해야했던 

    student.get_name(), student.set_name()이라는 부분이 없어지고 student.name으로 통일되어 사용이 가능합니다.

     

    아래같이 @property라는 데코레이터를 작성하여도 동일하게 작동합니다. @property 데코레이터를 사용할려고 할 때는 getter에 @property 장식자를 설정하고 setter에 @필드명.setter를 설정하여 사용합니다.

    class Student:
        def __init__(self, name, age, grade):
            self.name = name
            self.age = age
            self.grade = grade
    
        # 정의할 함수에 데코레이터 작성하기
        @property
        def get_name(self):
            return self.__name
    
        # 필드명.setter
        @name.setter
        def set_name(self, setName):
            self.__name = setName

     

     

    여기까지가 property내장함수 @property데코레이터에 대한 설명 이였습니다.

     

    그리고 코드를 작성하다가 발견한 것이 getter에 self__name으로 설정을 하는 부분이 있는데 이 부분은 캡슐화에 대한 내용입니다. '_' (언더바)를 두개 작성을 하면 python에서는 다른 곳에서 가져다 사용할 수 없게 되어 캡슐화가 가능합니다. java에서는 private 변수 같은 개념이라고 생각하시면 될것같습니다. python 에서는 타입에대해 힌트를 주는 경우가 있지만 타입을 명시하는 경우가 없기 때문에 캡슐화를 구현하기 위해 만들어놓은 기능인 것같습니다. 다음에는 '_'(언더바)에 대한 내용을 다루오 보도록 하겠습니다.

    반응형

    댓글

Designed by Tistory.