2010-11-05 2 views
5

Почему функция 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 

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

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

ответ

2

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

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

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

5

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

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

+0

+1 Понимание этого было, когда лампочка действительно продолжалась над моей головой для Python (ну, для динамических языков вообще ...) – bgporter

+0

Мне любопытно, как PythonWin может дать мне правильный список атрибутов для завершения с экземпляром COMObject, и можно ли сделать то же самое в коде Python, или если он делает то, что пакет win32com не раскрывает. – geoffspear