8

Python の 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

Location は呼び出し可能で、ファイル パスを返しますが、最初の結果には表示されません。また、コード補完ツールでも表示されません。ゲッターメソッドで取得しているからでしょうか? _prop_map_get_ と _prop_map_put_ の下にリストされています。

また、currentTrack._prop_map_get_['Location'] が "(1610874880, 2, (8, 0), (), 'Location', None)" を返すのに、currentTrack.Location がファイル パスを返すのはなぜですか? ファイルパス文字列はどこで取得していますか?

4

2 に答える 2

7

Python では、オブジェクトは__getattr__メソッドを持つことができます。存在しない属性への属性アクセスに対して呼び出されます。このオブジェクトは_prop_map_get_の実装の一部としてを使用しているようです__getattr__

属性要求を満たすため__getattr__に任意の計算を行うことAttributeErrorができ、処理できない名前を発生させることができるため、利用可能なすべての属性を外部からリストする方法はありません。

于 2010-11-05T17:18:44.453 に答える
4

良いもの。Dir() は正しく機能し、動作は説明可能です。

場所は currentTrack のプロパティですが、currentTrack._prop_map_get_ 経由でのみアクセスできます。呼び出し可能な _prop_map_get_ は dir(currentTrack) にリストされています。currentTrack._prop_map_get_ にマップされている getattr を参照してください。

ラッパーである win32com には、そのようなさまざまなケースがあります。

于 2010-11-05T17:19:54.010 に答える