[Python] Proxy Design Pattern
class Proxy:
    def __init__(self, obj):
        self._obj = obj
    def __getattr__(self, name):
        return getattr(self._obj, name)
    def __setattr__(self, name, value):
        if name.startswith('_'): # 본인 객체일 때
            super().__setattr__(name, value)
        else: # 본인 객체가 아닐 때
            setattr(self._obj, name, value)
if __name__ == '__main__':
    class A:
        def __init__(self, x):
            self.x = x
        def spam(self):
            print('A.spam')
    a = A(42)
    p = Proxy(a)
    print(p.x) # 42
    print(p.spam()) # A.spam
    p.x = 37
    print('Should be 37:', p.x)
    print('Should be 37:', a.x)
| 42 A.spam None Should be 37: 37 Should be 37: 37 | 
위 코드는 객체 a를 Proxy()에 넣으면 객체 p에 접근하면 마치 a에 접근하는 것처럼 하는 proxy design pattern 이다.
위 코드에서 print(p.x) 가 수행될 때 error가 발생해야하지만 error가 안난다. Error가 발생하지 않는 이유는 __getattr__() special 함수 때문이다.
__getattr__()
자신에게 없는 속성을 접근 했을 때 호출되는 함수다. 위 코드에서 p 객체에는 x가 없기 때문에 A class의 x를 꺼내온다.
멤버 변수뿐만 아니라 멤버 함수도 똑같이 수행된다.
__setattr__()
자신에게 있거나 없는 경우 호출되는 special 함수다. 즉 무조건 호출되는 함수다.
멤버 변수의 시작 문자가 ‘_‘라면 일반적으로 본인의 멤버 변수를 지정하기 때문에 첫 번째 __setattr__() 함수가 수행된다.
