신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

@property를 살펴보기전에 Get,Set method의 알아야하고, Get, Set method를 위해 접근지정자 private, public, protected에 대해 알아둘 필요가 있다.

 

 

 

접근지정자(Access Modifier)

접근지정자에는 private, public, protected, default가 있다. 하지만, 높은 자유도 및 편리함을 추구하는 파이썬(Python)에는 접근지정자라는 개념이 없다. 그렇다고 사용 못하는 것은 아니다.

 

class cTest :

    def __init__(self) :
        pass

    def public(self) :
        print("Call public()")

    def _protected(self) :
        print("Call _protected()")

    def __private(self) :
        print("Call __private()")


if __name__ == "__main__":
    test = cTest()
    test.public()
    test._protected()
    test.__private()​

 

실행결과

Call public()
Call _protected()
Traceback (most recent call last):
  File "C:\dev\python_study\property_study01.py", line 18, in <module>
    test.__private()
AttributeError: 'cTest' object has no attribute '__private'​

 

위와 같이 _(언더스코어, underscore)를 이용하여 표현이 가능하다.

_(1개)를 사용할때는 protected, __(2개)를 사용할때는 private을 표현할 수 있다.

 

참고로 Google python style guide에 의하면,

......

While prepending a double underscore(__ aka "dunder") to an instance variable or method effectively makes the variable or method private to its class(using name mangling) we dscourage its use as it impacts readability and testability and isn't really private.

......

 

요약하자면 "__를 인스턴스 변수 또는 메소드 앞에 붙이면 private과 같은 효과를 만들 수 있지만, 실제로 private은 아니기 때문에 사용을 삼가해 달라"고 말하고 있다.

 

Get, Set method

보통 다른 언어에서는 private 접근지정자를 이용하게 되면, 그 값을 가지고 오거나 값을 할당 해줄때 Get, Set 메소드를 이용한다.

 

파이썬에서 get set method를 표현을 해보면, 아래 코드와 같다.

 

class cTest2 :

    def __init__(self) :
        self.__name = "HH"
        self.__phone = "010-1234-1234"

    def getName(self) :
        return self.__name

    def setName(self, name) :
        self.__name = name

    def getPhone(self) :
        return self.__phone

    def setPhone(self, phone) :
        self.__phone = phone


if __name__ == "__main__":
    test = cTest2()

    print(test.getName())
    test.setName("Hong")
    print(test.getName())

    print(test.getPhone())
    test.setPhone("010-4321-4321")
    print(test.getPhone())​

 

HH
Hong
010-1234-1234
010-4321-4321​

위 접근지정자에서 살펴봤듯이, __를 불이게되면 외부에서 호출할 수 없다. 하지만, Get, Set 메소드를 사용하여 값을 가져오거나 값을 수정할 수 있다.

 

값을 가지고 올때는 Get 함수를 사용하고, 새로운 값을 할당할때는 Set함수를 사용한다.

 

@property의 사용법

위에서 Get, Set 메소드에 대해 살펴봤지만, 이는 파이썬다운 코드가 아니다.

파이썬에서는 @property 데코레이터를 이용하여, Get, Set 메소드를 표현한다.

 

class cTest3 :

    def __init__(self) :
        self.__name = "HH"
        self.__phone = "010-1234-1234"

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, name) :
        self.__name = name

    @property
    def phone(self) :
        return self.__phone

    @phone.setter
    def phone(self, phone) :
        self.__phone = phone

if __name__ == "__main__":
    test = cTest3()

    print(test.name)
    test.name = "Hong"
    print(test.name)

    print(test.phone)
    test.phone = "010-4321-4321"
    print(test.phone)​

 

HH
Hong
010-1234-1234
010-4321-4321​

get 메소드를 표현할때는 @property 데코레이터를 사용한다. set 메소드를 표현할때는 get 메소드의 이름을 name이라 했을때, @name.setter라고 표현한다.

 

get method = @property

set method = @method_name.setter

 

다른 글

2018/12/13 - [Language/Python] - 파이썬 OpenCV 설치부터, 이미지 비교(피처매칭, Feature Matching)

 

파이썬 OpenCV 설치부터, 이미지 비교(피처매칭, Feature Matching)

OpenCV 설치 pip 최신버전으로 업데이트를 진행합니다. python -m pip install --upgrade pip pip를 이용한 필요한 패키지 설치를 합니다. pip install matplotlib pip install numpy pip install OpenCV-Python..

hongku.tistory.com

2018/11/19 - [Network] - CDN, 콘텐츠 전송 네트워크에 대하여(Content Delivery Network)

 

CDN, 콘텐츠 전송 네트워크에 대하여(Content Delivery Network)

최근들어 음악, 실시간 스트리밍(Youtube, 트위치 등등), 대용량의 파일 다운도르와 같이 멀티 미디어 콘텐츠의 사용이 급증하고 있습니다. 더 나아가 4차산업혁명(Digital Transformation)과 함께 VR, AR 등등 더..

hongku.tistory.com

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기