Как получить тип экземпляра объекта win32com? - PullRequest
1 голос
/ 12 сентября 2009

Прежде всего, пожалуйста, извините меня за непоследовательность в вопросе этого вопроса. Возможно, есть, но на самом деле не знаю лучше.

Этот вопрос был поднят в контексте управления 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 и ' IITLibraryPlaylist ' из lib. Я пробовал type (itunes) и type (lib), но они оба возвращают только "", и это не то, что я ищу.

Спасибо.

Ответы [ 2 ]

1 голос
/ 12 сентября 2009

К сожалению, у меня нет под рукой Windows-машины, но я думаю, itunes.__class__ - это класс (old_style) рассматриваемого объекта itunes, а lib.__class__ - класса lib. Поэтому, глядя на атрибут __name__ классов, вы получите то, что вы хотите.

К сожалению, это классы старого стиля (поэтому type(...) не работает правильно), но win32com существует долгое время, задолго до того, как в Python 2.2 появились блестящие классы нового стиля, поэтому вполне понятно, я думаю; -).

0 голосов
/ 23 августа 2018

Основная причина этой ошибки атрибута в том, что ваш COM-сервер перешел с позднего связывания (динамический) на раннее связывание (статический).

  • В позднем связывании, всякий раз, когда вызывается метод, объект запрашивается для метода, и если он завершается успешно, то может быть выполнен вызов.
  • В раннем связывании информация об объектной модели определяется заранее из информации о типе, предоставленной вызовом объекта. Раннее связывание использует MakePy. Кроме того, раннее связывание чувствительно к регистру.

Попробуйте:

itunes = win32com.client.dynamic.Dispatch("iTunes.Application")

Это заставит COM-сервер установить фокус на динамический модуль, который должен предоставлять вам только COM-объект iTunes.

...