초보 개발자

30강 프로퍼티 본문

Python/윤성우 열혈 파이썬

30강 프로퍼티

taehyeki 2022. 1. 25. 10:22

[안전하게 접근하기]

객체가 갖는 값에 직접 접근하는 것은 오류의 확률을 높이므로 메소드를 통해 접근하는 것이 안전하다.

 따라서 언더바 2개를 사용하여 변수를 만들고, 이를 외부에서 접근하지 못하도록 설정한 뒤

getter와 setter을 생성하여 이 걸로 값을 변경 및 조회를 하도록 하는 경우가 있다. 하지만 이 경우에는 복잡해질 수 있다. 예를들어 전에는 n.a = 5  n.a 이런식으로 값을 직접 변경 및 조회가 가능했지만 이젠 n.seta(5) n.geta() 이런식으로 변경 및 조회를 해야하니까 말이다.

 

따라서 아래와 같이 작성을 해보자

프로퍼티를 함수를 호출하면서 프로퍼티 객체를 생성한다. 그리고 그 객체를 n에 넣어준 것이다. 그리고 인자에 2개의 메서드를 넣어주었다. 첫번째에는 getter 두번째에는 setter을 넣어주었다.

 

우리가 n1.n에 직접  접근을 할 수있는 이유는 n이라는 프로퍼티를 만들었기 때문이다

이 것이 이퀄 기호 = 를 기준으로 왼쪽에 존재하면 setter가 실행이되고 오른쪽에 존재하면 getter가 실행이된다.

따라서 n1.n = n1의 세터를 동작시키고, = n2.n + n3.n 은 n2와 n3의 게터를 동작시켜 n2의 __n값과 n3의 __n값을 더한 뒤 n1의 __n에 넣는 세터를 동작시킨 것이다. 

 

즉 프로퍼티를 설정하면 간접적으로 게터 세터에 접근할 수 있다. 우리가 설정해놓은 변수(n)을 가지고!

num = Natural(7)
num.n = 20 -> num.setn(20)
k = num.n  -> k = num.getn()

 

[property]

전에는 property의 객체를 생성과 동시에 인자로 getter와 setter을 넣어주었지만 이번엔 따로따로 진행해보려고한다.

게터를 등록한 새로운 프로퍼티가 반환이되고 그걸 다시 재참조 해주는 방향으로 가야한다. 세터도 마찬가지이다.

꼭 새로운 프로퍼티를 저장해줘야한다. 

 

property를 만들면 우리는 getn setn이라는 메서드를 사용하지 않을 것이다 n을 통해 해결이 가능하니.. 따라서 

getn을 만들 때 이름을 pm이라고 주고 등록한 뒤 setn을 만들 때도 이름을 pm이라고 주고 등록하는 경우도 많다.

 

[데코레이션]

데코레이터라는 것을 기반으로 프로퍼티를 지정하는 방법도 있다. 이는 앞서 설명한 방법보다 간결하여 추천되는 방식이다. 

@property의 선언의 결과는 다음과 같다 (파이썬에서는 메소드 이름도 변수이다. 그래서 메소드 이름에 다른 값을 저장하는 것도 가능하다)

 

'property 객체를 생성하면서 이어서 등장하는 메소드를 게터로 지정'

'그리고 이렇게 생성된 property 객체를 메소드 이름인 n에 저장'

 

위와 같은 일을 앞서 소개했던 방식으로 하려면 다음과 같이 해야한다. 그리고 실제로 아래의 코드를 위의 에제에 대신 넣어도 동일하게 작동한다.

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

 

@property의 의미는

n = property(n)을 메소드 n 정의 이후에 실행시켜라 ! 이 의미와 같다고 볼 수 있다.

 

 

@n.setter 선언의 결과는 다음과 같다.

'이어서 등장하는 메소드를 n에 저장된 property 객체의 세터로 등록한다.'

'그리고 이렇게 생성된 property 객체를 메소드 이름인 n에 저장'

 

'Python > 윤성우 열혈 파이썬' 카테고리의 다른 글

31강 네스티드 함수와 클로저  (0) 2022.01.25
29강 __slots__의 효과  (0) 2022.01.25
28강 정보은닉과 __dict__  (0) 2022.01.24
27강 연산자 오버로딩  (0) 2022.01.24
26강 스페셜 메소드  (0) 2022.01.18