2010-11-05 11 views
5

पाइथन में dir() फ़ंक्शन कैसे सभी कॉल करने योग्य विशेषताओं को नहीं दिखाता है?कुछ कॉल करने योग्य गुण 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 वर्तमान फ़ाइल क्यों लौटाता है जब वर्तमानTrack._prop_map_get _ ['स्थान'] लौटाता है "(1610874880, 2, (8, 0),(), 'स्थान', कोई नहीं)?" यह फ़ाइल पथ स्ट्रिंग कहां मिल रहा है?

उत्तर

2

अच्छा एक। Dir() सही ढंग से काम करता है और व्यवहार समझा जा सकता है।

स्थान वर्तमान ट्रैक की एक संपत्ति है लेकिन केवल CurrentTrack._prop_map_get_ के माध्यम से पहुंच योग्य है। कॉल करने योग्य _prop_map_get_ dir (currentTrack) में सूचीबद्ध है। getattr जो कुछ है वर्तमान में track._prop_map_get_

आपको Win32com में ऐसे कई मामले मिलेंगे जो एक रैपर है।

5

पायथन में, किसी ऑब्जेक्ट में __getattr__ विधि हो सकती है। यह एक अस्तित्वहीन विशेषता के लिए किसी भी विशेषता पहुंच के लिए बुलाया जाएगा। ऐसा लगता है कि __getattr__ के कार्यान्वयन के हिस्से के रूप में यह ऑब्जेक्ट _prop_map_get_ का उपयोग कर रहा है।

चूंकि __getattr__ विशेषता अनुरोध को पूरा करने के लिए मनमाने ढंग से गणना कर सकता है, और AttributeError को उन नामों के लिए बढ़ा सकता है, जो इसे संभाल नहीं सकते हैं, बाहर उपलब्ध सभी विशेषताओं को सूचीबद्ध करने के लिए बाहर से कोई रास्ता नहीं है।

+0

+1 यह समझना था जब लाइटबुल वास्तव में पाइथन के लिए मेरे सिर पर चला गया (अच्छी तरह से, सामान्य रूप से गतिशील भाषाओं के लिए ...) – bgporter

+0

मुझे उत्सुकता है कि कैसे पाइथनविन मुझे पूरा करने के लिए विशेषताओं की सही सूची दे सकता है 'COMObject' उदाहरण के साथ, और क्या पाइथन कोड में एक ही चीज़ करना संभव है, या यदि यह ऐसा कुछ कर रहा है जो Win32com पैकेज का खुलासा नहीं करता है। – geoffspear

संबंधित मुद्दे