파이썬 디자인 패턴
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__ 메서드가 반복적으로 불리는 문제가 있습니다.
왜냐하면 파이썬은 다음과 같이 2단계 생성(2-phase construction)이라고 해서 생성과 초기화를 구분하고 있기 때문이죠.
전 이 문제를 해결하기 위해 메타클래스(metaclass)에서 __init__ 메서드를 초기화 여부를 확인하는 메서드로 바꿔치기 하고 그 안에서 원래 __init__을 부르는 수법을 썼는데, 다른 해결책이 있을까요?
그런데 발표 중에 소개된 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__"
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>
>>>
>>> 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
nu = cls.__new__(cls,*a,**k)
if isinstance(nu, cls):
cls.__init__(nu,*a,**k)
return nu
전 이 문제를 해결하기 위해 메타클래스(metaclass)에서 __init__ 메서드를 초기화 여부를 확인하는 메서드로 바꿔치기 하고 그 안에서 원래 __init__을 부르는 수법을 썼는데, 다른 해결책이 있을까요?
- Filed under : 카테고리 없음