신규 블로그를 만들었습니다!
@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)
2018/11/19 - [Network] - CDN, 콘텐츠 전송 네트워크에 대하여(Content Delivery Network)
'Language > Python' 카테고리의 다른 글
pyinstaller를 이용한 Python exe 실행 파일 만들기 (86) | 2019.01.13 |
---|---|
파이썬 OpenCV 설치부터, 이미지 비교(피처매칭, Feature Matching) (1) | 2018.12.13 |
Python :: 파이썬3 디렉토리 및 파일 삭제, os 모듈과 shutil 모듈 사용하기 (0) | 2018.10.26 |
Python :: 파이썬에서 private과 public 변수 사용하기(파이썬의 범위 scope) (0) | 2018.10.21 |
Python :: 파이썬 집합 자료형 Set, 중복제거할때나 집합형태에 편리한 Set (0) | 2018.10.19 |
최근댓글