Как получить тип экземпляра объекта win32com?
Вопрос
Прежде всего, пожалуйста, извините меня за неточность в постановке этого вопроса.Вероятно, они есть, но на самом деле я не знаю лучшего.
Этот вопрос был поднят в контексте управления iTunes через COM из Python.
>>> itunes = win32com.client.Dispatch("iTunes.Application")
>>> itunes
<win32com.gen_py.iTunes 1.12 Type Library.IiTunes instance at 0x27248400>
>>> lib = itunes.LibraryPlaylist
>>> lib
<win32com.gen_py.iTunes 1.12 Type Library.IITLibraryPlaylist instance at 0x27249880>
Что я хотел бы сделать, так это получить 'IiTunes'из iTunes и'IITБиблиотекаПлейлист' из либ.Я пробовал type(itunes) и type(lib), но они оба возвращают только "", а это не то, что я ищу.
Спасибо.
Решение
К сожалению, у меня нет под рукой компьютера с Windows, чтобы попробовать, но я думаю itunes.__class__
это класс (old_style) itunes
рассматриваемый объект и lib.__class__
что из lib
.Итак, глядя на __name__
Атрибут классов должен дать вам то, что вы желаете.
К сожалению, это классы старого стиля (поэтому type(...)
не работает правильно), но win32com существует уже ДОЛГОЕ время, задолго до того, как в Python 2.2 появились блестящие классы нового стиля, так что я думаю, это вполне понятно ;-).
Другие советы
Основная причина этой ошибки атрибута заключается в том, что ваш COM-сервер перешел с позднего связывания (динамического) на раннее связывание (статическое).
- В позднем связывании при каждом вызове метода у объекта запрашивается метод, и если он успешен, то можно выполнить вызов.
- В раннем связывании информация объектной модели определяется заранее на основе информации о типе, предоставляемой вызовом объекта.Раннее связывание использует MakePy.Кроме того, раннее связывание чувствительно к регистру.
Пытаться:
itunes = win32com.client.dynamic.Dispatch("iTunes.Application")
Это заставит COM-сервер переключить фокус на динамический модуль, который должен предоставить вам только COM-объект iTunes.