Pythonルックアップをどうやって絞るのですか:make.up.a.dot.separated.name.and.use.it.until.destroyed = 777

StackOverflow https://stackoverflow.com/questions/1602745

  •  05-07-2019
  •  | 
  •  

質問

私はPythonの初心者であり、Pythonのドット名検索プロセスを試す非常に特定の悩みがあります。 " make.py"でクラスまたは関数をコーディングするにはどうすればよいですか?これらの割り当てステートメントが正常に機能するように

import make

make.a.dot.separated.name = 666
make.something.else.up = 123
make.anything.i.want = 777
役に立ちましたか?

解決

#!/usr/bin/env python

class Make:
    def __getattr__(self, name):
        self.__dict__[name] = Make()
        return self.__dict__[name]

make = Make()

make.a.dot.separated.name = 666
make.anything.i.want = 777

print make.a.dot.separated.name
print make.anything.i.want

特別な __ getattr __ メソッドは、名前付きの値が見つからないときに呼び出されます。行 make.anything.i.want は、次と同等の処理を行います:

m1 = make.anything    # calls make.__getattr__("anything")
m2 = m1.i             # calls m1.__getattr__("i")
m2.want = 777

上記の実装では、これらの __ getattr __ の呼び出しを使用して、不明なプロパティにアクセスするたびに Make オブジェクトのチェーンを作成します。これにより、実際の値が割り当てられる最終割り当てまで、ドットアクセスを任意の深さにネストできます。

Pythonドキュメント-属性アクセスのカスタマイズ

  

object .__ getattr __(self、name)

     

属性の検索で通常の場所で属性が見つからなかった場合に呼び出されます(つまり、インスタンス属性ではなく、 self のクラスツリーでも見つかりません)。 name は属性名です。このメソッドは、(計算された)属性値を返すか、 AttributeError 例外を発生させる必要があります。

     

通常のメカニズムで属性が見つかった場合、 __ getattr __()は呼び出されないことに注意してください。 (これは、 __ getattr __() __ setattr __()の間の意図的な非対称です。)これは、効率上の理由と __ getattr __()インスタンスの他の属性にアクセスする方法はありません。少なくともインスタンス変数については、インスタンス属性ディクショナリに値を挿入せずに(代わりに別のオブジェクトに値を挿入することで)完全な制御を偽造できることに注意してください。新しいスタイルのクラスで実際に完全な制御を取得する方法については、以下の __ getattribute __()メソッドを参照してください。

     

object .__ setattr __(self、name、value)

     

属性の割り当てが試行されたときに呼び出されます。これは、通常のメカニズムの代わりに呼び出されます(つまり、値をインスタンスディクショナリに格納します)。 name は属性名、 value はそれに割り当てられる値です。

     

__ setattr __()がインスタンス属性に割り当てたい場合、単に self.name = value —を実行するべきではありません。これにより、それ自体への再帰呼び出しが発生します。代わりに、インスタンス属性の辞書に値を挿入する必要があります(例: self .__ dict __ [name] = value )。新しいスタイルのクラスの場合、インスタンスディクショナリにアクセスするのではなく、同じ名前(たとえば、 object .__ setattr __(self、name、value))で基本クラスメソッドを呼び出す必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top