2012-03-04 47 views
1
>>> dir(classAInstance.objectTInstance.__dict__) 
    ['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', 
'__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', 
'__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', 
'__setitem__', '__str__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 
'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'] 

>>> classAInstance.objectTInstance.attB    # Access Method 1 
199 

>>> classAInstance.objectTInstance.__dict__['attB'] # Access Method 2 
199 

>>> classAInstance.objectTInstance['attB']   # Access Method 3 
Traceback (most recent call last): 
    File "<input>", line 1, in ? 
AttributeError: ObjectT instance has no attribute '__getitem__' 

クレーム:classAInstanceClassAobjectTInstanceのinsanceあるObjectTのインスタンスです。はAttributeError:ObjectTインスタンスには属性 '__getitem__' がありません

質問>classAInstance.objectTInstance属性attBを格納していますか? アクセス方法3が機能しないのはなぜですか? __dict__店舗は何ですか?

object.__dict__ 
    A dictionary or other mapping object used to store an object’s (writable) attributes. 

私の理解に基づいて、アクセス方法1と2はまったく同じです。またattBは、オブジェクト__dict__に格納されています。ObjectTです。 Access 3を動作させるために、ObjectTは__getitem__という辞書の魔法の機能を提供しなければなりません。

これは間違いありませんか?あなたがしようとした最初のメソッドを使って属性にアクセスするとき

は、属性がそこにあるかどうかを確認するためにPythonの最初のチェックに、あなたに__dict__

答えて

3

ありがとうございます。それがそうであれば、それはそれが使うものです。次に、オブジェクトの__class____dict__をチェックします。それでも見つからなければ、スーパークラスの検索を続けます。 (複数の継承が関係する場合は、より複雑になります)。まだ見つからない場合は、クラスまたはすべてのスーパークラスの__getattr__を探し、属性を取得するために呼び出します。これらのすべてが失敗すると、エラーになります。

2番目の方法は、オブジェクトの__dict__に直接アクセスします。クラスの属性をチェックしたり、__getattr__を呼び出したりしません。

3番目の方法は完全に別のものです。 __getitem__に電話をかけようとします(それを__getattr__と混同しないでください)。

1

辞書の対象となる辞書オブジェクトが__dict__であることが混乱の元です。 オブジェクトとその__dict__属性は同じ辞書ではありません。

ほとんどのPythonオブジェクトには、オブジェクトの属性を格納するために使用される__dict__属性があります。これらの属性は、.構文(オブジェクトの__dict__を、そのクラスおよびそれが派生したクラスとともに検索します)を使用してアクセスされます。あなたのオブジェクトの辞書である場合、それはまたの項目を格納します。これらは、[...]構文を使用してアクセスします。

あなたのdictサブクラスに__getattr__()__setattr__()のメソッドを書くことができます。このメソッドは、辞書の項目にドット表記、つまりJavaScriptを使ってアクセスできるようにします。 Pythonプログラマーは、PythonがJavaScriptのように動作することを期待していないので、これは一般的には悪い考えです。

関連する問題