Почему некоторые вызываемые атрибуты не перечислены в функции dir ()? - PullRequest
7 голосов
/ 05 ноября 2010

Почему функция dir () в Python не отображает все вызываемые атрибуты?

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

Расположение вызывается и возвращает путь к файлу, но не указан в первом результате.Это также не отображается с инструментами завершения кода.Это потому, что он получен методом получения?Я вижу его в списке _prop_map_get_ и _prop_map_put _.

Кроме того, почему currentTrack.Location возвращает путь к файлу, когда currentTrack._prop_map_get _ ['Location'] возвращает "(1610874880, 2, (8, 0), (), 'Местоположение', Нет)? "Где он получает строку пути к файлу?

Ответы [ 2 ]

7 голосов
/ 05 ноября 2010

В python объект может иметь метод __getattr__. Он будет вызываться для любого доступа к атрибуту для несуществующего атрибута. Похоже, этот объект использует _prop_map_get_ как часть своей реализации __getattr__.

Поскольку __getattr__ может выполнять произвольные вычисления для удовлетворения запроса атрибута и может вызывать AttributeError для имен, которые он не может обработать, извне невозможно перечислить все доступные атрибуты.

3 голосов
/ 05 ноября 2010

Хороший. Dir () работает правильно, и поведение объяснимо.

Местоположение является свойством currentTrack, но доступно только через currentTrack._prop_map_get_. Вызываемый _prop_map_get_ указан в каталоге (currentTrack). См. getattr , который как-то сопоставлен с currentTrack._prop_map_get_

вы найдете различные такие случаи в win32com, который является оберткой.

...