Perché alcuni attributi richiamabili non elencati dalla funzione dir ()?
Domanda
Come mai la funzione dir () in Python non mostra tutti gli attributi richiamabili?
import win32com.client
iTunes = win32com.client.gencache.EnsureDispatch("iTunes.Application")
currentTrack = win32com.client.CastTo(iTunes.CurrentTrack,"IITFileOrCDTrack")
print dir(currentTrack)
Risultato:
['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
La posizione è richiamabile e restituisce il percorso del file, ma non è elencato nel primo risultato. Inoltre non si presenta con gli strumenti di completamento del codice. Forse perché proprio essere recuperato attraverso un metodo getter? Lo vedo elencati sotto _prop_map_get_ e _prop_map_put _.
Inoltre, perché currentTrack.Location restituisce un percorso di file quando currentTrack._prop_map_get _ [ 'Località'] ritorni "(1.610.874,88 mila, 2, (8, 0), (), 'Luogo', nessuno)?" Dove sta ottenendo la stringa di percorso del file?
Soluzione
Buona uno. Dir () fa funzionare correttamente e il comportamento è spiegabile.
La posizione è una proprietà della currentTrack ma è accessibile solo tramite currentTrack._prop_map_get_. Il _prop_map_get_ callable è elencato in dir (currentTrack). Vedere getattr , che è in qualche modo mappato currentTrack._prop_map_get _
troverete vari casi in win32com che è un wrapper.
Altri suggerimenti
In pitone, un oggetto può avere un metodo __getattr__
. Sarà richiamato per qualsiasi accesso attributo per un attributo inesistente. Sembra che questo oggetto sta usando _prop_map_get_
come parte della sua attuazione __getattr__
.
Dal __getattr__
può fare il calcolo arbitrario per soddisfare la richiesta di attributi, e può aumentare AttributeError
per i nomi che non può gestire, non c'è modo dall'esterno per elencare tutti gli attributi che sono disponibili.