لماذا لا يتم إدراج بعض السمات القابلة للاتصال في وظيفة Dir ()؟

StackOverflow https://stackoverflow.com/questions/4108298

  •  29-09-2019
  •  | 
  •  

سؤال

كيف تأتي وظيفة 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 بالنسبة للأسماء التي لا يمكن التعامل معها ، لا توجد طريقة من الخارج لإدراج جميع السمات المتوفرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top