簡易なSingleton

  • May 07, 2007 06:15

一度だけインスタンスを作りたいクラス、いわゆるSingletonパターンですが通常Pythonで書く場合はクラスメソッドをつかったりゴニョゴニョするのですが、Djangoのソース見てたら簡易パージョンがありました。

厳密な意味ではSingletonではないのですが十分かと思います。

In [1]: class dummy(object):pass
   ...:

In [2]: s = dummy()

In [3]: s.hoge = "hoge"

In [4]: s.fuga = 123

In [5]: del dummy

In [6]: ss = dummy()
---------------------------------------------------------------------------
exceptions.NameError                                 Traceback (most recent call last)

NameError: name 'dummy' is not defined

ダミークラスをインスタンス化したあと、クラスをdelで消してます。 インスタンスsはこの通り普通に使えます。

[7]: s.hoge
Out[7]: 'hoge'

In [8]: s.fuga
Out[8]: 123

もっとも本当にクラスが消された訳じゃないのでこうすればインスタンスを作れます。

In [9]: ss = s.__class__()

In [10]: type(ss)
Out[10]: <class '__main__.dummy'>

こーいうのは配列のreverseに[::-1]とやるくらい当たり前なことなのですかね?