2005-11-17

PyVISA のシングルトン


__all__ = ["visa_library", "get_status"] + visa_functions
# ↑ __all__ には、このモジュールがインポートされたときに、インポートした側
# が参照できる名前のリストが入ります。
# foo.py に、__all__ = ["hoge", "moge"] と書いておくと、
# from foo import *
# を実行するときに、hoge と moge の名前がインポートされます。
# (マニュアルの 6.4.1 章)
# __all__ を定義しなければ、すべてのパブリックな名前がインポートされます。

# Add all symbols from #visa_exceptions# and #vpp43_constants# to the list of

# exported symbols

import visa_exceptions, vpp43_constants

__all__.extend([name for name in vpp43_constants.__dict__.keys() +

visa_exceptions.__dict__.keys() if name[0] != '_'])

# __dict__ は、オブジェクトの属性が、辞書で格納されています。

# __dict__.keys() で、そのオブジェクトのプロパティやメソッド名が入っている。



# load VISA library



class Singleton(object):

"""Base class for singleton classes.



Taken from <http://www.python.org/2.2.3/descrintro.html>. I added the

definition of __init__.



"""

def __new__(cls, *args, **kwds):

it = cls.__dict__.get("__it__")

if it is not None:

return it

cls.__it__ = it = object.__new__(cls)

it.init(*args, **kwds)

return it

def init(self, *args, **kwds):

pass

def __init__(self, *args, **kwds):

pass



vpp43.py では __new__ メソッドを使って、シングルトンを実装しています。__new__ はクラスをインスタンス化するときに呼び出され、この戻り値がインスタンスになります。下の例では、Bar クラスをインスタンス化しても、__new__ メソッドの戻り値である Foo クラスのインスタンスが生成されます。




>>> class Foo(object):
... def hello(self): print "hello"
...
>>> class Bar(object):
... def __new__(cls): return Foo()
...
>>> x = Bar()
>>> x
<__main__.Foo object at 0x00B31FD0>
>>> x.hello()
hello