如何获取win32com对象的实例类型?

2 投票
2 回答
2117 浏览
提问于 2025-04-15 14:17

首先,请原谅我这个问题标题可能有些不太清楚,可能确实有些问题,但我也不知道该怎么更好地表达。

这个问题是在用Python通过COM控制iTunes的情况下提出的。

>>> 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>

我想做的是从iTunes中获取IiTunes,从lib中获取IITLibraryPlaylist。我试过用type(itunes)和type(lib),但它们都只返回了"",这不是我想要的结果。

谢谢。

2 个回答

1

这个属性错误的主要原因是你的COM服务器从“晚绑定”(动态绑定)变成了“早绑定”(静态绑定)。

  • 在晚绑定中,每当调用一个方法时,系统会先去查询这个对象是否有这个方法,如果找到了,就可以进行调用。
  • 而在早绑定中,系统会提前根据对象调用提供的类型信息来确定对象模型的信息。早绑定会使用MakePy工具。而且,早绑定对大小写是敏感的。

你可以尝试:

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

这样做会强制COM服务器关注动态模块,这样你就只会得到iTunes的COM对象。

2

很遗憾,我手头没有Windows电脑可以试试,但我觉得 itunes.__class__ 是你提到的 itunes 对象的(旧式)类,而 lib.__class__lib 的类。所以查看这些类的 __name__ 属性应该能帮你找到你想要的东西。

可惜的是,这些都是旧式类(所以 type(...) 不能正常工作),不过win32com已经存在很久了,早在Python 2.2推出新式类之前就有了,所以我觉得这完全可以理解;-)。

撰写回答