Search Results for '파이썬 디자인 패턴'

1 POSTS

  1. 2007.08.31 파이썬 디자인 패턴 1

파이썬 디자인 패턴

Posted 2007. 8. 31. 18:19
구글 개발자의 날 US(Google Developer Day US)에서 Alex Martelli가 발표한 Python Design Patterns를 봤습니다. (광식님께 감사.) 새로운 디자인 패턴을 소개하거나 깊이 있는 내용을 다룬 건 아니지만, 기존 디자인 패턴 책들이 대게  C++, 자바 위주로 서술된 것에 비해 이 발표에서는 파이썬을 중심으로 디자인 패턴을 간결하게 설명하고 있습니다. 기억이 가물가물 하신 분은 시간 내서 한 번 보시면 좋을 듯 합니다. 참고로 발표자인 Alex Martelli는 <Python in a Nutshell>의 저자이고, <Python Cookbok>의 에디터이기도 합니다.

그런데 발표  중에 소개된 Singleton 예제를 보면 __init__  메서드가 반복적으로 불리는 문제가 있습니다.

class Singleton(object):
    def __new__(cls, *a, **k):
        if not hasattr(cls, '_inst'):
            cls._inst = super(Singleton, cls).__new__(cls, *a, **k)
        return cls._inst

    def __init__(self):
        print "__init__"


$ python -i a.py
>>> s = Singleton()
__init__
>>> s
<__main__.Singleton object at 0x00C8FC70>
>>> s = Singleton()
__init__
>>> s
<__main__.Singleton object at 0x00C8FC70>
>>>


왜냐하면 파이썬은 다음과 같이 2단계 생성(2-phase construction)이라고 해서 생성과 초기화를 구분하고 있기 때문이죠.

def__call__(cls,*a,**k):
    nu = cls.__new__(cls,*a,**k)
    if isinstance(nu, cls):
        cls.__init__(nu,*a,**k)
    return nu

전 이 문제를 해결하기 위해 메타클래스(metaclass)에서 __init__ 메서드를 초기화 여부를 확인하는 메서드로 바꿔치기 하고 그 안에서 원래 __init__을 부르는 수법을 썼는데, 다른 해결책이 있을까요?