لماذا لا يتم إدراج بعض السمات القابلة للاتصال في وظيفة 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
الموقع قابل للاتصال ويعيد مسار الملف ، ولكنه غير مدرج في النتيجة الأولى. كما أنه لا يظهر مع أدوات إكمال الكود. هل لأنه يتم جلبه من خلال طريقة getter؟ أراه مدرجًا ضمن _prop_map_get_ و _prop_map_put_.
أيضًا ، لماذا تقوم CurrentTrack.location بإرجاع مسار ملف عندما يتم إرجاع CurrentTrack._prop_map_get _ ['location'] (1610874880 ، 2 ، (8 ، 0) ، () ، "الموقع" ، لا شيء)؟ " أين تحصل على سلسلة مسار الملف؟
المحلول
هذا جيد. dir () لا يعمل بشكل صحيح والسلوك يمكن تفسيره.
الموقع خاصية لـ CurrentTrack ولكن يمكن الوصول إليها فقط عبر CurrentTrack._prop_map_get_. يتم سرد _prop_map_get_ القابل للاتصال في DIR (CurrentTrack). نرى getAttr وهو ما يتم تعيينه إلى CurrentTrack._prop_map_get_
ستجد العديد من هذه الحالات في Win32Com وهو غلاف.
نصائح أخرى
في بيثون ، يمكن أن يكون للكائن ملف __getattr__
طريقة. سيتم استدعاؤه لأي وصول سمة لسمة غير موجودة. يبدو أن هذا الكائن يستخدم _prop_map_get_
كجزء من تنفيذها __getattr__
.
حيث __getattr__
يمكن إجراء حساب تعسفي لتلبية طلب السمات ، ويمكن أن يرفع AttributeError
بالنسبة للأسماء التي لا يمكن التعامل معها ، لا توجد طريقة من الخارج لإدراج جميع السمات المتوفرة.