为什么某些可调用属性不在dir()函数中列出?
为什么Python里的dir()函数不显示所有可以调用的属性呢?
import win32com.client
iTunes = win32com.client.gencache.EnsureDispatch("iTunes.Application")
currentTrack = win32com.client.CastTo(iTunes.CurrentTrack,"IITFileOrCDTrack")
print dir(currentTrack)
结果:
['AddArtworkFromFile', 'CLSID', 'Delete', 'GetITObjectIDs', 'Play', 'Reveal', 'UpdateInfoFromFile', 'UpdatePodcastFeed', '_ApplyTypes_', '__doc__', '__eq__', '__getattr__', '__init__', '__module__', '__ne__', '__repr__', '__setattr__', '_get_good_object_', '_get_good_single_object_', '_oleobj_', '_prop_map_get_', '_prop_map_put_', 'coclass_clsid']
print currentTrack.Location
Location是一个可以调用的属性,它会返回文件路径,但在第一次的结果中没有显示出来。用代码补全工具时也找不到它。这是因为它是通过一个获取方法来获取的吗?我看到它在_prop_map_get_和_prop_map_put_下面被列出来。
还有,为什么currentTrack.Location会返回一个文件路径,而currentTrack._prop_map_get_['Location']却返回"(1610874880, 2, (8, 0), (), 'Location', None)”?文件路径字符串是从哪里来的呢?
2 个回答
8
在Python中,一个对象可以有一个叫做__getattr__
的方法。当你尝试访问一个不存在的属性时,这个方法就会被调用。看起来这个对象在实现__getattr__
的时候,使用了_prop_map_get_
。
因为__getattr__
可以进行任意的计算来满足属性的请求,并且可以对它无法处理的名称抛出AttributeError
错误,所以从外部无法列出所有可用的属性。
4
很好。Dir()确实能正常工作,它的行为是可以解释的。
Location是currentTrack的一个属性,但只能通过currentTrack._prop_map_get_来访问。你可以在dir(currentTrack)中找到可调用的_function_map_get_。看看getattr,它在某种程度上与currentTrack._prop_map_get_相关联。
在win32com中,你会发现很多类似的情况,因为它是一个包装器。