[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__()
함수가 수행된다.