엄범


파이썬에서는 decorator와 ``c property()`` 클래스를 이용해 프로퍼티를 지정할 수 있다.

전자인 ``py @property``와 ``py @{var_name}.setter``을 사용하는 방법이 더 깔끔한 듯.


프로퍼티는 일반 변수와 같이 명명하는게 통일성 있는 것 같다. 메서드지만 외부에서는 변수처럼 보여야 하니까.


lock 변수를 사용할 때 좋은 듯.

```python
@property
def running_flag(self):
    with self.__running_flag_lock:
        flag = self.__running_flag
    return flag

@running_flag.setter
def running_flag(self, value):
    with self.__running_flag_lock:
        self.__running_flag = value
```
주의할 점. setter와 getter를 같이 정의하는 경우 getter가 위쪽에 있어야 함.
setter의 ``py @running_flag.`` 데커레이터에서 없는 변수라고 에러가 발생하기 때문.

private 네임 맹글링

backing field의 이름은 외부에서는 보이지 않게 하고, 프로퍼티를 사용해서만 접근하도록 해야 하므로

``py __var`` 처럼 앞에 __를 붙여서 명명해준다.

이렇게 하면 name mangling해주기 때문에 바로 접근하면 없는걸로 나온다.


사실 python에서는 접근제한자라는 개념이 없기는 하지만, 프로퍼티를 쓰는건 커스텀 접근자를 정의하겠다는 의미도 있기 때문에, 커스텀 접근자를 사용하는 경우 반드시 이를 거쳐서 사용하도록 강제할 수 있다는데 의의가 있다.


```python

>>> t = TestCls("qwer")

>>> t.name

'qwer'

>>> t.name = "asdf"

>>> t.name

'asdf'

>>> t.__name

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'TestCls' object has no attribute '__name'

>>> t._TestCls__name

'asdf'

```