__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