2015-10-09 6 views
5

werkzeugライブラリからLocalクラスの__init__方法ですなぜ彼らが書いた`setattr(self、...、...)`の代わりに `object .__ setattr __(self、...、...)`を使用していますか?</p> <pre><code>def __init__(self): object.__setattr__(self, '__storage__', {}) object.__setattr__(self, '__ident_func__', get_ident) </code></pre> <p>私はこのコードについて二つのことを理解していない:以下の

  1. object.__setattr__(self, '__storage__', {}) 
    

    単純に代わって

    `setattr(self, '__storage__', {})` 
    
  2. なぜ同じクラスが__setattr__を定義しているため、単純に

    self.__storage__ = {} 
    

答えて

6

これにより、デフォルトのPython定義__setattr__が確実に使用されます。非標準動作を実行するためにクラスが__setattr__をオーバーライドしても、元の__setattr__の動作にアクセスしたい場合は、一般的に使用されます。 WERKZEUGの場合

、あなたがLocalクラスを見ればあなたが__setattr__はこのように定義されて表示されます:

def __setattr__(self, name, value): 
    ident = self.__ident_func__() 
    storage = self.__storage__ 
    try: 
     storage[ident][name] = value 
    except KeyError: 
     storage[ident] = {name: value} 

代わりに、オブジェクトの辞書に属性を設定するのではなく、それらを設定し、 __storage__以前に初期化された辞書。 __storage__属性を設定するには(後でself.__storage__のようにアクセスできるように)、オブジェクトから元の定義__setattr__を使用する必要があります。そのため、コンストラクターで厄介な表記が使用されます。

+1

ソースに厄介なように見えますが、クラスのユーザーにとって素晴らしいインターフェイスを提供します。 –

1

を書くことができれば、彼らも__setattr__を使用し、最初の行はself.__ident_func__()を言うので、これは、それをバイパスする必要がなかったではないだろうまだ仕事。

2

継承チェーンの他の場所でオーバーライドされたメソッドインスタンスメソッドではなく、ベースのobject.__setattr__実装を明示的に使用する必要があります。 Localは独自の__setattr__を実装しています。

関連する問題