dir(x) 内のすべての名前が属性アクセスに有効ではないのはなぜですか?
-
20-08-2019 - |
質問
なぜコーダーは何かを詰め込むのでしょうか __dict__
属性アクセスには使用できないのでしょうか?たとえば、私の Plone インスタンスでは、 dir(portal)
含まれています index_html
, 、 しかし portal.index_html
AttributeError が発生します。これは、 __class__
の属性 Products.ZCatalog.Catalog.mybrains
. 。ちゃんとした理由があるのでしょうか dir()
信用できないの?
周りをつつく inspect
モジュール、彼らが使用しているようです object.__dict__['x']
この理由とトリガーしたくないため、属性アクセスの代わりに getattr
魔法。
解決
Ploneについては詳しくないので、以下は一般的なものです。
から ドキュメント の dir
:
オブジェクトに次の名前のメソッドがある場合
__dir__()
, 、この方法は呼び出され、属性のリストを返す必要があります。これにより、カスタムを実装するオブジェクトが可能になります__getattr__()
または__getattribute__()
方法をカスタマイズする機能dir()
彼らの属性を報告します。
単なる推測ですが、考えられることが 2 つあります。
オブジェクトには、
__dir__()
持っていない属性を返すメソッド(可能性は低いですが) オブジェクト もっている 求めている属性 (つまり、入った
obj.__dict__
またはtype(obj).__dict__
, 、ただしオーバーライド__getattr__
戻るAttributeError
編集: __dir__
は Python 2.6 以降でのみサポートされていますが、(非推奨の) 特別な属性は __methods__
そして __members__
以前のバージョンの代わりに使用できます。