2005-11-18

PyVISA - VisaLibraryクラスの __call__

NI-VISA ライブラリにアクセスするときは、visa_library が唯一のグローバルなアクセスポイントです。関数呼び出しは「visa_library().hogehoge()」という風に書きます。




# シングルトンのクラス
class VisaLibrary(Singleton):
def init(self):
self.__lib = self.__cdecl_lib = None
def __call__(self, force_cdecl = False):
# インスタンスを呼び出したときに、実行されるメソッド
# このメソッドは、ctypes でロードしたライブラリのオブジェクトを返す。
# ライブラリがロードされていなければ、load_library() メソッドを実行。
if self.__lib is None or self.__cdecl_lib is None:
self.load_library()
# 強制的に C 規約のライブラリを使用する場合と、
# 何も指定しない場合で返すオブジェクトが異なる
if force_cdecl:
return self.__cdecl_lib
return self.__lib
def load_library(self, path = None):
# Windows NT 系の場合
if os.name == 'nt':
# path が指定されれば、そのファイルをロード
if path:
self.__lib = windll.LoadLibrary(path)
self.__cdecl_lib = cdll.LoadLibrary(path)
# path が指定されていなければ、"visa32" ライブラリをロード
else:
self.__lib = windll.visa32
self.__cdecl_lib = cdll.visa32
# 以下 posix の場合と、エラーの場合が続く
# ...
#...
visa_library = VisaLibrary()


これで visa_library().hogehoge() と書くと、visa_library.__lib.hogehoge() を呼び出すことになります。__lib には cytpes でロードした DLL へのアクセスポイントが代入されています。



なぜこうするのか、よく分かりません。別の部分では self.__lib.hogehoge と書いて引数を設定していますし。VisaLibrary.__getattr__() を使ってはいけないのでしょうか。