2010-11-05 28 views
5

Dlaczego funkcja dir() w Pythonie nie wyświetla wszystkich atrybutów wywoływalnych?Dlaczego niektóre opcje wywoływalne nie są wymienione przez funkcję dir()?

import win32com.client 

iTunes = win32com.client.gencache.EnsureDispatch("iTunes.Application") 
currentTrack = win32com.client.CastTo(iTunes.CurrentTrack,"IITFileOrCDTrack") 

print dir(currentTrack) 

Wynik:

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

Lokalizacja jest wymagalne i zwraca ścieżkę do pliku, ale nie jest wpisany do pierwszego wyniku. Nie wyświetla się również z narzędziami do uzupełniania kodu. Czy to dlatego, że jest pobierana metodą gettera? Widzę go na liście _prop_map_get_ i _prop_map_put_.

Ponadto, dlaczego currentTrack.Location zwraca ścieżkę do pliku, gdy currentTrack._prop_map_get _ ['Location'] zwraca "(1610874880, 2, (8, 0),()," Lokalizacja ", brak)?" Gdzie znajduje się ciąg ścieżki pliku?

Odpowiedz

2

Dobra. Dir() działa poprawnie, a zachowanie można wyjaśnić.

Lokalizacja jest własnością currentTrack, ale jest dostępna tylko za pośrednictwem currentTrack._prop_map_get_. Podpowiedź _prop_map_get_ znajduje się w katalogu dir (currentTrack). Zobacz getattr, który jest jak zmapowany do currentTrack._prop_map_get_

znajdziesz różne takie przypadki w win32com, który jest otoką.

5

W pythonie obiekt może mieć metodę __getattr__. Zostanie on wywołany dla dowolnego dostępu do atrybutu dla nieistniejącego atrybutu. Wygląda na to, że ten obiekt używa _prop_map_get_ jako części swojej implementacji __getattr__.

Ponieważ __getattr__ może wykonywać dowolne obliczenia, aby spełnić żądanie atrybutu, i może podnieść AttributeError dla nazw, których nie może obsłużyć, nie ma możliwości z zewnątrz do wyświetlenia wszystkich dostępnych atrybutów.

+0

+1 Zrozumiałem, kiedy żarówka naprawdę przeszła mi przez głowę w Pythonie (no, ogólnie, w językach dynamicznych ...) – bgporter

+0

Jestem ciekawa, w jaki sposób PythonWin może podać poprawną listę atrybutów do uzupełnienia z instancją "COMObject" i czy można zrobić to samo w kodzie Pythona lub jeśli robi się to, czego nie ujawnia pakiet win32com. – geoffspear

Powiązane problemy