Вам не нужно изменять код; класс ATS, как вы его представили, уже учитывает то, что вы описали. Вместо этого: создает несколько экземпляров ATS , каждый из которых указывает, какую DLL использовать.
Ваше описание проблемы состоит из двух частей:
- A отображение , от некоторого ключа до пути к файлу DLL.
- Оболочка API , позволяющая указать ключ в приведенном выше отображении при вызове API.
В Python встроенный в тип dict является естественным способом реализации отображения. Вы можете использовать простую строку в качестве ключа.
import os.path
# You might get the path to your DLL files some other way,
# for example by reading a process environment variable.
# In this example I just hard-code the path root.
dll_file_path_root = os.path.join('/usr/lib', 'ats')
dll_file_paths = {
'foo': os.path.join(dll_file_path_root, 'foo.dll'),
'bar': os.path.join(dll_file_path_root, 'bar_v5.dll'),
'baz': os.path.join(dll_file_path_root, 'super_baz.dll'),
}
Существующий класс ATS, как вы его представили выше, уже реализует оболочку API. Каждый экземпляр будет содержать ссылку (свой атрибут _dll
для внутреннего использования), с которой будет обращаться DLL к экземпляру ATS. Класс инициализирует каждый экземпляр ATS любой указанной вами DLL. Итак:
# Create an ATS instance that holds a reference to the ‘foo.dll’ library.
foo_ats = ATS(dll_path=dll_file_paths['foo'])
# Create an ATS instance that holds a reference to the ‘bar_v5.dll’ library.
bar_ats = ATS(dll_path=dll_file_paths['bar'])
# Call the ‘lorem’ function in the ‘foo.dll’ library.
foo_ats._call_dll(func_name='lorem')
# Call the ‘lorem’ function in the ‘bar_v5.dll’ library.
bar_ats._call_dll(func_name='lorem')
Это одно из основных преимуществ определения классов: они инкапсулируют общее поведение класса объектов, в то же время позволяя каждому объекту иметь индивидуальные атрибуты, которые их различают.