2015-12-31 9 views
5

私は、Pythonでは、クラス/インスタンス変数にアクセスするたびに、__getattribute__メソッドを呼び出して結果を取得することを理解しています。しかし、私はobj.__dict__['x']を直接使用して、私が欲しいものを得ることができます。Pythonの__getattribute__とobj .__ dict __ ['x']の違いは?

私は少し違いが分かりましたか? また、getattr(obj, name)を使用している場合は、内部で__getattribute__またはobj.__dict__[name]を呼び出していますか?

ありがとうございます。

+0

http://stackoverflow.com/questions/3278077/difference-between-getattr-vs-getattribute疑問を解決する必要があります。 –

+0

@AashishPコメントありがとうございます。しかし、この記事では '__getattr__'と' __getattribute__'の違いについて説明しています。 'getattr'は' __getattr__'とほとんど関係がないようですので、 'getattr'は実際に' obj .__ dict____ [name] 'と同じであることを意味していますか? – cizixs

+0

そうです。私はCPythonのソースコードを掘り下げようとしました。ここで私が見つけたのは、平易な言語で、http://stackoverflow.com/questions/24863787/python-the-getattribute-method-and-descriptors –

答えて

1

__getattribute__()の方法は、下位レベルの属性処理用です。

デフォルトの実装では、内部__dict__(または__slots__)の名​​前 が見つかります。属性が見つからない場合は、__getattr__()を呼び出します。 (コメントのように)

UPDATE:

彼らは、Pythonのデータモデルの属性を見つけるためのさまざまな方法があります。可能な状況で適切にフォールバックするように設計された内部的な方法です。手掛かり:「機械はにあり、b.xtype(b).__dict__['x'].__get__(b, type(b))に変換します。 docs.python.org/3/howto/descriptor.html

+0

これは '__getattribute__'が' __dict__'のtry find属性を呼び出すことを意味しますか?つまり、 '__getattribute__'は' __dict__'メソッドのスーパーセットです。 – cizixs

+0

これらは、Pythonデータモデルで属性を検索するさまざまな方法です。可能な状況で適切にフォールバックするように設計された内部的な方法です。 "機械は、' b.x'を 'type(b).__ dict __ ['x'] .__ get __(b、type(b))'に変換する 'object .__ getattribute __()'にあります。 https://docs.python.org/3/howto/descriptor.htmlから – tuned

0

すべてのpythonオブジェクトに属性が格納されている辞書はありませんが、計算に必要なスロット、プロパティ、属性が必要です。また、__getattribute____getattr__を上書きすることもできます。属性のアクセスは、単純な辞書検索よりも複雑です。あなたが内部属性__xxx__を使うべきではありません

getattr(obj, name) 

通常:だから属性にアクセスするための通常の方法では、属性名を持つ変数を持っている

obj.x 

wennです。

+0

清算していただきありがとうございます。私は 'obj.x'を使用すると' __getattribute__'を実行でき、見つからなければ '__getattr__'を呼び出すことができます。内部の '__dict__'変数はどこにありますか?インスタンス属性にアクセスするときに使用され、直接使用することはお勧めしない場合は、そのポイントは何ですか? – cizixs

0

__dict__の属性は、オブジェクトにあるすべての属性のサブセットです。属性'ab''ac''show'(およびいくつかの他)を持つことになります。このクラスの

class C: 
    ac = "+AC+" 
    def __init__(self): 
     self.ab = "+AB+" 

    def show(self): 
     pass 

インスタンスic = C()

は、このクラスを考えてみましょう。 __gettattribute__はそれらをすべて見つけますが、 ic.__dict__には「ab」だけが格納されています。他の2つは C.__dict__にあります。

関連する問題