Como chegar tipo de instância de um objeto win32com?
Pergunta
Em primeiro lugar, por favor, desculpe-me para qualquer incoerência na telha desta questão. Ele provavelmente tem alguns, mas realmente não sei melhor.
Esta questão foi suscitada no âmbito de controlar iTunes via COM de 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>
O que eu gostaria de fazer é recuperar ' IiTunes ' do iTunes e ' IITLibraryPlaylist ' de lib. Eu tentei tipo (itunes) e tipo (lib), mas ambos só retorno "" e isso não é o que estou procurando.
Graças.
Solução
Infelizmente eu não tenho nenhuma máquina Windows à mão para tentar, mas acho que itunes.__class__
é a classe (old_style) do objeto itunes
em questão, e lib.__class__
que de lib
. Então, olhando para o atributo __name__
das classes deve dar-lhe o que você deseja.
É, infelizmente, que estas são as classes de estilo antigo (assim type(...)
não funciona direito), mas win32com tem sido em torno de um longo tempo, desde bem antes das classes de estilo novo brilhantes nasceram em Python 2.2, por isso é totalmente compreensível , eu acho; -)
Outras dicas
A principal razão para este erro atributo é porque seu COM-servidor mudou de ligação tardia (dinâmico) para ligação antecipada (estático).
- Na ligação tardia, sempre que um método é chamado, o objeto é consultado para o método e se for bem sucedido, então a chamada pode ser feita.
- Na ligação antecipada, as informações do modelo de objeto é determinado com antecedência de informações de tipo fornecido pela chamada objeto. Primeiras marcas de ligação utilizar de MakePy. Além disso, no início de ligação é sensível.
Tente:
itunes = win32com.client.dynamic.Dispatch("iTunes.Application")
Isto irá forçar o servidor COM para o foco ajustado no módulo dinâmico que deve dar-lhe apenas o objeto COM do iTunes.