Programming,  Python

[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

위 코드는 객체 aProxy()에 넣으면 객체 p에 접근하면 마치 a에 접근하는 것처럼 하는 proxy design pattern 이다.

위 코드에서 print(p.x) 가 수행될 때 error가 발생해야하지만 error가 안난다. Error가 발생하지 않는 이유는 __getattr__() special 함수 때문이다.

__getattr__()

자신에게 없는 속성을 접근 했을 때 호출되는 함수다. 위 코드에서 p 객체에는 x가 없기 때문에 A class의 x를 꺼내온다.
멤버 변수뿐만 아니라 멤버 함수도 똑같이 수행된다.

__setattr__()

자신에게 있거나 없는 경우 호출되는 special 함수다. 즉 무조건 호출되는 함수다.
멤버 변수의 시작 문자가 ‘_‘라면 일반적으로 본인의 멤버 변수를 지정하기 때문에 첫 번째 __setattr__() 함수가 수행된다.

Leave a Reply

Your email address will not be published. Required fields are marked *