# '__' 붙은 변수는 private 변수 이다.
---------------------------------------------------------------------------------------------- 
>>> class Dummy():
	def __init__(self, x):
		self._num = x
		self.__num = x

	def getNum(self):
		print("_num : {}".format(self._num))
		print("__num : {}".format(self.__num))

		
>>> d = Dummy(0)
>>> d.getNum()
_num : 0
__num : 0

>>> d._num = 1
>>> d.__num = 2   # 할당되는것 처럼 보이나 인스턴스변수에 할당한것이 아니다.
>>> d.getNum()
_num : 1
__num : 0


# 일반적인 def 선언 메소드로 setter와 getter역할을 하게 할 수 있으나, static한 클래스변수처럼 인스턴스변수를 제어 할 수는 없다. 
---------------------------------------------------------------------------------------------- 
>>> class Dummy():
	def __init__(self):
		self.__num = 0

	def getNum(self):
		return self.__num

	def setNum(self, x):
		self.__num = x

	
>>> d = Dummy()
>>> d.setNum(9)
>>> d.getNum()
9
>>> 


# getter와 setter를 정의하여 static한 클래스변수처럼 값을 제어해보자
---------------------------------------------------------------------------------------------- 
>>> class Dummy():
	def __init__(self):
		self.__num = 0

	# getter getter를 setter보다 먼저 선언해야 한다.
	@property
	def num(self):
		return self.__num

	# setter setter를 getter보다 나중에 선언해야 한다.
	@num.setter
	def num(self, x):
		self.__num = x

	def printNum(self):
		print("__num : {}".format(self.__num))

		
>>> d = Dummy()
>>> d.num = 9
>>> d.num
9
>>> d.printNum()
__num : 9

>>> d.num = 4
>>> d.num
4
>>> d.printNum()
__num : 4
>>> 



# https://docs.python.org/3/library/functions.html?highlight=property#property